Skip to content

Commit ba6b02d

Browse files
authored
fix: [OS-456] [OS-457] further fixes for modify (#541)
* further fixes for modify * fix forcedend behavior * migrate fixture ids for qspids * - adding a few untagged ports to standalone topology - add encapsulation to EdgePort - remove jackson customization, use .properties config instead - pom.xml cleanups, dependency updates * more logging for commit errors fix commit error callback failing factor out notification ids return something for query even if reserve has not happened yet * fix npe * improve timeouts, fix some NPEs * fix abort param * fix NSO migrate * set redeploy correctly
1 parent b7dd7d9 commit ba6b02d

23 files changed

Lines changed: 250 additions & 206 deletions

CHANGES.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,13 @@
11
# OSCARS Release Notes
2+
### 1.2.25
3+
> May 2025
4+
- NSI rewrite
5+
- HELD reservations no longer written to DB, hold -> commit flow updated
6+
- adding a few untagged ports to standalone topology
7+
- add encapsulation to EdgePort
8+
- remove jackson customization, use .properties config instead
9+
- pom.xml cleanups, dependency updates
10+
211
### 1.2.24
312
> Apr 2025
413
- OS-442: Implement NsoLspStateSyncer class to manage NSO LSP state synchronization between OSCARS and NSO.

backend/config/application.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ spring.jpa.properties.hibernate.id.new_generator_mappings=true
2727
spring.jackson.serialization.INDENT_OUTPUT = true
2828
spring.mvc.pathmatch.matching-strategy=ant_path_matcher
2929

30+
spring.jackson.serialization.write-dates-as-timestamps=false
31+
3032
server.port=${OSCARS_BACKEND_WEB_PORT}
3133
server.ssl.enabled=false
3234
server.servlet-path=/

backend/config/topology.json

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -126,16 +126,8 @@
126126
"reservableEgressBw": 100000,
127127
"reservableVlans": [
128128
{
129-
"floor": 1112,
130-
"ceiling": 4095
131-
},
132-
{
133-
"floor": 2,
134-
"ceiling": 910
135-
},
136-
{
137-
"floor": 912,
138-
"ceiling": 1110
129+
"floor": 0,
130+
"ceiling": 0
139131
}
140132
],
141133
"esdbEquipmentInterfaceId": 14106
@@ -860,12 +852,8 @@
860852
"reservableEgressBw": 10000,
861853
"reservableVlans": [
862854
{
863-
"floor": 2,
864-
"ceiling": 1798
865-
},
866-
{
867-
"floor": 1801,
868-
"ceiling": 4095
855+
"floor": 0,
856+
"ceiling": 0
869857
}
870858
],
871859
"esdbEquipmentInterfaceId": 13245

backend/pom.xml

Lines changed: 3 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -140,34 +140,12 @@
140140
<artifactId>commons-validator</artifactId>
141141
<version>1.7</version>
142142
</dependency>
143-
144143
<!-- for serializing JSONBs into psql -->
145144
<dependency>
146145
<groupId>io.hypersistence</groupId>
147146
<artifactId>hypersistence-utils-hibernate-62</artifactId>
148147
<version>3.6.0</version>
149148
</dependency>
150-
<!-- for saving Instants -->
151-
<dependency>
152-
<groupId>com.fasterxml.jackson.datatype</groupId>
153-
<artifactId>jackson-datatype-jsr310</artifactId>
154-
<version>2.18.2</version>
155-
</dependency>
156-
<dependency>
157-
<groupId>com.fasterxml.jackson.core</groupId>
158-
<artifactId>jackson-core</artifactId>
159-
<version>2.18.2</version>
160-
</dependency>
161-
<dependency>
162-
<groupId>com.fasterxml.jackson.core</groupId>
163-
<artifactId>jackson-databind</artifactId>
164-
<version>2.18.2</version>
165-
</dependency>
166-
<dependency>
167-
<groupId>com.fasterxml.jackson.core</groupId>
168-
<artifactId>jackson-annotations</artifactId>
169-
<version>2.18.2</version>
170-
</dependency>
171149

172150
<dependency>
173151
<groupId>org.slf4j</groupId>
@@ -196,13 +174,6 @@
196174
<artifactId>spring-boot-starter-security</artifactId>
197175
</dependency>
198176

199-
<!-- override vulnerable ver -->
200-
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
201-
<dependency>
202-
<groupId>org.springframework</groupId>
203-
<artifactId>spring-webmvc</artifactId>
204-
<version>6.2.1</version>
205-
</dependency>
206177
<dependency>
207178
<groupId>org.springframework.ws</groupId>
208179
<artifactId>spring-ws-core</artifactId>
@@ -243,10 +214,11 @@
243214
<version>5.4.3</version>
244215
</dependency>
245216

217+
246218
<dependency>
247219
<groupId>org.springdoc</groupId>
248220
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
249-
<version>2.5.0</version>
221+
<version>2.8.8</version>
250222
</dependency>
251223
<dependency>
252224
<groupId>com.google.guava</groupId>
@@ -300,12 +272,7 @@
300272
<dependency>
301273
<groupId>com.github.seancfoley</groupId>
302274
<artifactId>ipaddress</artifactId>
303-
<version>5.5.0</version>
304-
</dependency>
305-
<dependency>
306-
<groupId>org.apache.commons</groupId>
307-
<artifactId>commons-lang3</artifactId>
308-
<version>3.14.0</version>
275+
<version>5.5.1</version>
309276
</dependency>
310277

311278
<dependency>

backend/src/main/java/net/es/oscars/app/ser/JacksonConfig.java

Lines changed: 0 additions & 20 deletions
This file was deleted.

backend/src/main/java/net/es/oscars/app/util/PrettyPrinter.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,20 @@
22

33
import com.fasterxml.jackson.core.JsonProcessingException;
44
import com.fasterxml.jackson.databind.ObjectMapper;
5+
import com.fasterxml.jackson.databind.SerializationFeature;
56
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
67
import lombok.extern.slf4j.Slf4j;
78

89
@Slf4j
910
public class PrettyPrinter {
1011
public static void prettyLog(Object o) {
1112
try {
12-
String pretty = new ObjectMapper().registerModule(new JavaTimeModule()).writerWithDefaultPrettyPrinter().writeValueAsString(o);
13+
String pretty = new ObjectMapper()
14+
.registerModule(new JavaTimeModule())
15+
.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
16+
.writerWithDefaultPrettyPrinter()
17+
.writeValueAsString(o);
18+
1319
log.info(pretty);
1420

1521
} catch (JsonProcessingException e) {

backend/src/main/java/net/es/oscars/nsi/ent/NsiMapping.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,12 @@ public class NsiMapping {
5151

5252
@Builder.Default
5353
private Integer notificationId = 1;
54+
public Integer getNotificationId() {
55+
if (notificationId == null) {
56+
notificationId = 1;
57+
}
58+
return notificationId;
59+
}
5460

5561
private Instant lastModified;
5662

backend/src/main/java/net/es/oscars/nsi/svc/NsiMappingService.java

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,14 @@ public Optional<NsiMapping> getMappingForOscarsId(String oscarsConnectionId) {
130130
return Optional.of(mappings.getFirst());
131131
}
132132

133-
133+
@Transactional
134+
public int nextNotificationId(NsiMapping mapping) {
135+
if (mapping.getNotificationId() == null) {
136+
mapping.setNotificationId(1);
137+
}
138+
mapping.setNotificationId(mapping.getNotificationId() + 1);
139+
return nsiRepo.save(mapping).getNotificationId();
140+
}
134141

135142
/* db funcs */
136143
@Transactional
@@ -169,7 +176,7 @@ public NsiMapping newMapping(String nsiConnectionId, String nsiGri, String nsaId
169176
.nsaId(nsaId)
170177
.lifecycleState(LifecycleStateEnumType.CREATED)
171178
.provisionState(ProvisionStateEnumType.RELEASED)
172-
.reservationState(ReservationStateEnumType.RESERVE_START)
179+
.reservationState(ReservationStateEnumType.RESERVE_CHECKING)
173180
.lastModified(Instant.now())
174181
.build();
175182
log.info("added an NSI mapping: "+nsiConnectionId+" --> "+oscarsConnectionId);
@@ -178,26 +185,22 @@ public NsiMapping newMapping(String nsiConnectionId, String nsiGri, String nsaId
178185

179186
public Optional<P2PServiceBaseType> getP2PService(ReserveType rt) {
180187
ReservationRequestCriteriaType crit = rt.getCriteria();
181-
P2PServiceBaseType p2pt = null;
188+
P2PServiceBaseType p2pt;
182189
for (Object o : crit.getAny()) {
183190
if (o instanceof P2PServiceBaseType) {
184191
p2pt = (P2PServiceBaseType) o;
192+
return Optional.of(p2pt);
185193
} else {
186194
try {
187-
188-
@SuppressWarnings("unchecked") JAXBElement<P2PServiceBaseType> payload
189-
= (JAXBElement<P2PServiceBaseType>) o;
195+
@SuppressWarnings("unchecked") JAXBElement<P2PServiceBaseType> payload = (JAXBElement<P2PServiceBaseType>) o;
190196
p2pt = payload.getValue();
197+
return Optional.of(p2pt);
191198
} catch (ClassCastException ex) {
192199
log.error(ex.getMessage(), ex);
193-
p2pt = null;
194200
}
195201
}
196202
}
197-
if (p2pt == null) {
198-
return Optional.empty();
199-
}
200-
return Optional.of(p2pt);
203+
return Optional.empty();
201204
}
202205

203206

backend/src/main/java/net/es/oscars/nsi/svc/NsiQueries.java

Lines changed: 59 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import net.es.oscars.app.exc.NsiInternalException;
99
import net.es.oscars.app.exc.NsiValidationException;
1010
import net.es.oscars.nsi.beans.NsiErrors;
11+
import net.es.oscars.nsi.beans.NsiRequest;
1112
import net.es.oscars.nsi.db.NsiMappingRepository;
1213
import net.es.oscars.nsi.ent.NsiMapping;
1314
import net.es.oscars.resv.ent.*;
@@ -26,10 +27,12 @@ public class NsiQueries {
2627

2728
private final NsiMappingRepository nsiRepo;
2829
private final NsiMappingService nsiMappingService;
30+
private final NsiRequestManager nsiRequestManager;
2931

30-
public NsiQueries(NsiMappingRepository nsiRepo, NsiMappingService nsiMappingService) {
32+
public NsiQueries(NsiMappingRepository nsiRepo, NsiMappingService nsiMappingService, NsiRequestManager nsiRequestManager) {
3133
this.nsiRepo = nsiRepo;
3234
this.nsiMappingService = nsiMappingService;
35+
this.nsiRequestManager = nsiRequestManager;
3336
}
3437

3538
public void validateQuery(QueryType query) throws NsiException {
@@ -77,6 +80,7 @@ public QueryRecursiveConfirmedType queryRecursive(QueryType query) throws NsiInt
7780
@Transactional
7881
public QuerySummaryConfirmedType querySummary(QueryType query) throws NsiInternalException {
7982
log.info("querySummary");
83+
8084
QuerySummaryConfirmedType qsct = new QuerySummaryConfirmedType();
8185

8286
qsct.setLastModified(nsiMappingService.getCalendar(Instant.now()));
@@ -120,8 +124,11 @@ public QuerySummaryConfirmedType querySummary(QueryType query) throws NsiInterna
120124

121125
Long resultId = 0L;
122126
for (NsiMapping mapping : mappings) {
123-
// log.debug("query result entry "+mapping.getNsiConnectionId()+" --- "+mapping.getOscarsConnectionId());
124-
QuerySummaryResultType qsrt = this.toQSRT(mapping);
127+
// this might be null if there's no in-flight reserve request, that's ok
128+
NsiRequest nsiRequest = nsiRequestManager.getInFlightRequest(mapping.getNsiConnectionId());
129+
130+
// log.debug("query result entry "+mapping.getNsiConnectionId()+" --- "+mapping.getOscarsConnectionId());
131+
QuerySummaryResultType qsrt = this.toQSRT(mapping, nsiRequest);
125132
if (qsrt != null) {
126133
qsrt.setResultId(resultId);
127134
qsct.getReservation().add(qsrt);
@@ -172,50 +179,71 @@ public QueryRecursiveResultType toQRRT(NsiMapping mapping) throws NsiInternalExc
172179
return qrrt;
173180
}
174181

175-
public QuerySummaryResultType toQSRT(NsiMapping mapping) throws NsiInternalException {
182+
public QuerySummaryResultType toQSRT(NsiMapping mapping, NsiRequest request) throws NsiInternalException {
176183
Optional<Connection> mc = nsiMappingService.getMaybeOscarsConnection(mapping);
184+
QuerySummaryResultType qsrt = new QuerySummaryResultType();
185+
qsrt.setConnectionId(mapping.getNsiConnectionId());
186+
QuerySummaryResultCriteriaType qsrct = new QuerySummaryResultCriteriaType();
187+
String description;
188+
ConnectionStatesType cst;
177189
if (mc.isEmpty()) {
178-
log.error("nsi mapping for nonexistent OSCARS connection " + mapping.getOscarsConnectionId());
179-
return null;
180-
}
181-
Connection c = mc.get();
182-
if (c.getPhase().equals(Phase.ARCHIVED)) {
183-
// if this is archived return it only the last modified date was 24 hours ago or less
184-
int yesterday = (int) Instant.now().minus(24L, ChronoUnit.HOURS).getEpochSecond();
185-
if (c.getLast_modified() > yesterday) {
190+
// if an OSCARS connection is not present, we might be in RESV_CHECKING, in that case return something
191+
// there should be an in-flight request so use that
192+
if (request == null || request.getIncoming() == null) {
193+
log.error("NSI mapping without OSCARS connection has no in-flight request " + mapping.getNsiConnectionId());
186194
return null;
187195
}
188-
}
196+
log.info("returning a placeholder for "+mapping.getNsiConnectionId());
197+
qsrct.setSchedule(request.getIncoming().getCriteria().getSchedule());
198+
description = request.getIncoming().getDescription();
199+
cst = new ConnectionStatesType();
200+
cst.setProvisionState(mapping.getProvisionState());
201+
cst.setLifecycleState(mapping.getLifecycleState());
202+
cst.setReservationState(mapping.getReservationState());
203+
DataPlaneStatusType dst = new DataPlaneStatusType();
204+
dst.setVersion(mapping.getDataplaneVersion());
205+
dst.setActive(false);
206+
dst.setVersionConsistent(true);
207+
cst.setDataPlaneStatus(dst);
189208

190-
QuerySummaryResultType qsrt = new QuerySummaryResultType();
191-
qsrt.setConnectionId(mapping.getNsiConnectionId());
192-
193-
QuerySummaryResultCriteriaType qsrct = new QuerySummaryResultCriteriaType();
194-
Schedule sch;
195-
if (c.getPhase().equals(Phase.HELD)) {
196-
sch = c.getHeld().getSchedule();
197209
} else {
198-
sch = c.getArchived().getSchedule();
210+
Connection c = mc.get();
211+
Schedule sch;
212+
213+
if (c.getPhase().equals(Phase.ARCHIVED)) {
214+
// if this is archived, return it only the last modified date was 24 hours ago or less
215+
int yesterday = (int) Instant.now().minus(24L, ChronoUnit.HOURS).getEpochSecond();
216+
if (c.getLast_modified() > yesterday) {
217+
return null;
218+
}
219+
}
220+
if (c.getPhase().equals(Phase.HELD)) {
221+
sch = c.getHeld().getSchedule();
222+
} else {
223+
sch = c.getArchived().getSchedule();
224+
}
225+
description = c.getDescription();
226+
227+
qsrct.setSchedule(nsiMappingService.oscarsToNsiSchedule(sch));
228+
Components cmp = getComponents(c);
229+
P2PServiceBaseType p2p = nsiMappingService.makeP2P(cmp, mapping);
230+
231+
net.es.nsi.lib.soap.gen.nsi_2_0.services.point2point.ObjectFactory p2pof = new ObjectFactory();
232+
qsrct.getAny().add(p2pof.createP2Ps(p2p));
233+
cst = nsiMappingService.makeConnectionStates(mapping, c);
199234
}
200-
qsrct.setSchedule(nsiMappingService.oscarsToNsiSchedule(sch));
235+
201236
qsrct.setServiceType(NsiService.SERVICE_TYPE);
202237
qsrct.setVersion(mapping.getDataplaneVersion());
203238

204-
Components cmp = getComponents(c);
205-
P2PServiceBaseType p2p = nsiMappingService.makeP2P(cmp, mapping);
206239

207-
net.es.nsi.lib.soap.gen.nsi_2_0.services.point2point.ObjectFactory p2pof
208-
= new ObjectFactory();
209-
210-
qsrct.getAny().add(p2pof.createP2Ps(p2p));
211240
qsrt.getCriteria().add(qsrct);
212241

213-
qsrt.setDescription(c.getDescription());
242+
qsrt.setDescription(description);
214243
qsrt.setGlobalReservationId(mapping.getNsiGri());
215244
qsrt.setRequesterNSA(mapping.getNsaId());
216-
ConnectionStatesType cst = nsiMappingService.makeConnectionStates(mapping, c);
217245
qsrt.setConnectionStates(cst);
218-
qsrt.setNotificationId(0L);
246+
qsrt.setNotificationId(Long.valueOf(mapping.getNotificationId()));
219247
return qsrt;
220248
}
221249

0 commit comments

Comments
 (0)