public class ContainerConfig implements Serializable {
private static final long serialVersionUID = 2L;
private static final String regexName = "^\\w+$";
+ private static final String containerProfile = System.getProperty("container.profile") == null ? "Container"
+ : System.getProperty("container.profile");
+ private static final String ADMIN_SUFFIX = "Admin";
+ private static final String OPERATOR_SUFFIX = "Operator";
@XmlElement
private String container;
return status;
}
- /* Allow adding ports which are already present
- if (!ports.isEmpty()) {
- List<String> intersection = new ArrayList<String>(ports);
- intersection.retainAll(ncList);
- if (!intersection.isEmpty()) {
- return new Status(StatusCode.CONFLICT, "The following node connectors are already part of this container: "
- + intersection);
- }
- }
- */
-
// Add ports
ports.addAll(ncList);
return new Status(StatusCode.SUCCESS);
config.getName()));
}
}
- }
- /*
- * Revisit the following flow-spec confict validation later based on more testing.
- */
- /*
- if (!delete) {
- // Check for overlapping container flows in the request
- int size = cFlowConfigs.size();
- for (int i = 0; i < size; i++) {
- ContainerFlowConfig first = cFlowConfigs.get(i);
- for (int j = i + 1; j < size; j++) {
- ContainerFlowConfig second = cFlowConfigs.get(j);
- if (first.overlap(second)) {
- return new Status(StatusCode.BADREQUEST, String.format(
- "Invalid Request: the proposed flow specs overlap: %s <-> %s", first.getName(),
- second.getName()));
- }
- }
+ } else {
+ // Check for conflicting names with existing cFlows
+ List<String> conflicting = new ArrayList<String>(existingNames);
+ conflicting.retainAll(proposedNames);
+ if (!conflicting.isEmpty()) {
+ return new Status(StatusCode.CONFLICT,
+ "Invalid Flow Spec configuration: flow spec name(s) conflict with existing flow specs: "
+ + conflicting.toString());
}
- // Check if any of the proposed container flows overlap with the
- // existing ones
- for (ContainerFlowConfig current : cFlowConfigs) {
+
+ /*
+ * Check for conflicting flow spec match (we only check for strict
+ * equality). Remove this in case (*) is reintroduced
+ */
+ if (this.containerFlows != null && !this.containerFlows.isEmpty()) {
+ Set<Match> existingMatches = new HashSet<Match>();
for (ContainerFlowConfig existing : this.containerFlows) {
- if (current.overlap(existing)) {
- return new Status(StatusCode.BADREQUEST, String.format(
- "Invalid Request: the proposed flow specs overlap: %s <-> %s", current.getName(),
- existing.getName()));
+ existingMatches.addAll(existing.getMatches());
+ }
+ for (ContainerFlowConfig proposed : cFlowConfigs) {
+ if (existingMatches.removeAll(proposed.getMatches())) {
+ return new Status(StatusCode.CONFLICT, String.format(
+ "Invalid Flow Spec configuration: %s conflicts with existing flow spec",
+ proposed.getName()));
}
}
}
}
- */
+
return new Status(StatusCode.SUCCESS);
}
}
return list;
}
+
+ private String getContainerRole(boolean admin) {
+ return String.format("%s-%s-%s", containerProfile, container, (admin ? ADMIN_SUFFIX : OPERATOR_SUFFIX));
+ }
+
+ /**
+ * Return the well known administrator role for this container
+ *
+ * @return The administrator role for this container
+ */
+ public String getContainerAdminRole() {
+ return getContainerRole(true);
+ }
+
+ /**
+ * Return the well known operator role for this container
+ *
+ * @return The operator role for this container
+ */
+ public String getContainerOperatorRole() {
+ return getContainerRole(false);
+ }
+
+ public String getContainerGroupName() {
+ return String.format("%s-%s", containerProfile, container);
+ }
}