import org.opendaylight.controller.sal.common.util.Rpcs;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.EndpointService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.Endpoints;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.EndpointsL3;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.RegisterEndpointInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.SetEndpointGroupConditionsInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.UnregisterEndpointInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.UnsetEndpointGroupConditionsInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoint.fields.L3Address;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.ConditionMapping;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.ConditionMappingKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.l3.EndpointL3;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.l3.EndpointL3Builder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.l3.EndpointL3Key;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3Key;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.has.endpoint.group.conditions.EndpointGroupCondition;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.has.endpoint.group.conditions.EndpointGroupConditionKey;
import org.opendaylight.yangtools.yang.binding.DataObject;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.opendaylight.yangtools.yang.common.RpcError;
rpcRegistration =
rpcRegistry.addRpcImplementation(EndpointService.class, this);
-
- LOG.info("Created endpoint registry");
+
+ // XXX TODO - age out endpoint data and remove
+ // endpoint group/condition mappings with no conditions
+
+ LOG.debug("Created endpoint registry");
}
@Override
new EndpointKey(ep.getL2Namespace(), ep.getMacAddress());
InstanceIdentifier<Endpoint> iid =
InstanceIdentifier.builder(Endpoints.class)
- .child(Endpoint.class, key).build();
+ .child(Endpoint.class, key)
+ .build();
DataModificationTransaction t = dataProvider.beginTransaction();
t.putOperationalData(iid, ep);
Collection<RpcError> errors = new ArrayList<>();
.setL3Namespace(l3addr.getL3Namespace())
.build();
InstanceIdentifier<EndpointL3> iid_l3 =
- InstanceIdentifier.builder(EndpointsL3.class)
- .child(EndpointL3.class, key3).build();
+ InstanceIdentifier.builder(Endpoints.class)
+ .child(EndpointL3.class, key3)
+ .build();
t.putOperationalData(iid_l3, ep3);
docommit(t, iid_l3.toString(), "register", errors);
new EndpointL3Key(l3addr.getIpAddress(),
l3addr.getL3Namespace());
InstanceIdentifier<EndpointL3> iid_l3 =
- InstanceIdentifier.builder(EndpointsL3.class)
- .child(EndpointL3.class, key3).build();
+ InstanceIdentifier.builder(Endpoints.class)
+ .child(EndpointL3.class, key3)
+ .build();
DataModificationTransaction t =
dataProvider.beginTransaction();
t.removeOperationalData(iid_l3);
errors);
return Futures.immediateFuture(result);
}
+
+ @Override
+ public Future<RpcResult<Void>>
+ setEndpointGroupConditions(SetEndpointGroupConditionsInput input) {
+
+ ConditionMappingKey key =
+ new ConditionMappingKey(input.getEndpointGroup());
+
+ Collection<RpcError> errors = new ArrayList<>();
+ for (EndpointGroupCondition condition: input.getEndpointGroupCondition()) {
+ EndpointGroupConditionKey ckey =
+ new EndpointGroupConditionKey(condition.getCondition());
+ InstanceIdentifier<EndpointGroupCondition> iid =
+ InstanceIdentifier.builder(Endpoints.class)
+ .child(ConditionMapping.class, key)
+ .child(EndpointGroupCondition.class, ckey)
+ .build();
+ DataModificationTransaction t =
+ dataProvider.beginTransaction();
+ t.putOperationalData(iid, condition);
+ docommit(t, iid.toString(), "set", errors);
+ }
+
+ RpcResult<Void> result = Rpcs.<Void>getRpcResult(errors.isEmpty(),
+ errors);
+ return Futures.immediateFuture(result);
+ }
+
+ @Override
+ public Future<RpcResult<Void>>
+ unsetEndpointGroupConditions(UnsetEndpointGroupConditionsInput input) {
+
+ ConditionMappingKey key =
+ new ConditionMappingKey(input.getEndpointGroup());
+
+ Collection<RpcError> errors = new ArrayList<>();
+ for (EndpointGroupCondition condition: input.getEndpointGroupCondition()) {
+ EndpointGroupConditionKey ckey =
+ new EndpointGroupConditionKey(condition.getCondition());
+ InstanceIdentifier<EndpointGroupCondition> iid =
+ InstanceIdentifier.builder(Endpoints.class)
+ .child(ConditionMapping.class, key)
+ .child(EndpointGroupCondition.class, ckey)
+ .build();
+ DataModificationTransaction t =
+ dataProvider.beginTransaction();
+ t.removeOperationalData(iid);
+ docommit(t, iid.toString(), "set", errors);
+ }
+
+ RpcResult<Void> result = Rpcs.<Void>getRpcResult(errors.isEmpty(),
+ errors);
+ return Futures.immediateFuture(result);
+ }
}
leaf tenant {
type gbp-common:tenant-id;
mandatory true;
- description "The tenant with which this endpoint is associated";
+ description
+ "The tenant with which this endpoint is associated";
}
leaf l2-namespace {
type gbp-common:l2-namespace-id;
}
}
+ grouping has-endpoint-group-conditions {
+ description
+ "Base type for object with endpoint group to condition
+ mappings.";
+
+ leaf endpoint-group {
+ description "The endpoint group conditions to assign";
+ type gbp-common:endpoint-group-id;
+ }
+ list endpoint-group-condition {
+ description
+ "The conditions associated with this endpoint
+ group";
+ key "condition";
+ leaf condition {
+ description "A condition name to associate.";
+ type gbp-common:condition-name;
+ }
+ }
+ }
+
container endpoints {
description
- "Endpoints indexed by layer 2 addreses. When modifying data here,
- you must also modify data in the endpoints-l3 container as well.";
+ "Repository for operational state data about endpoints needed for
+ policy resolution.";
+
list endpoint {
+ description
+ "Endpoints indexed by layer 2 addreses. When modifying
+ data here, you must also modify data in the
+ endpoints-l3 list as well.";
key "l2-namespace mac-address";
uses endpoint-fields;
}
- }
- container endpoints-l3 {
- description
- "Endpoints indexed by layer 3 addreses. When modifying data here,
- you must also modify data in the endpoints container as well.";
list endpoint-l3 {
+ description
+ "Endpoints indexed by layer 3 addreses. When modifying
+ data here, you must also modify data in the endpoints
+ list as well.";
+
key "l3-namespace ip-address";
leaf l3-namespace {
uses endpoint-fields;
}
- }
- // XXX - TODO - allow registering conditions on endpoint groups
- // and not just on endpoints themselves.
+ list condition-mapping {
+ description
+ "A list mapping conditions to entire endpoint groups.
+ This offers a quickly way to set a condition on many
+ endpoints at once.";
+
+ key "endpoint-group";
+ uses has-endpoint-group-conditions;
+ }
+ }
rpc register-endpoint {
description
}
}
}
+
+ rpc set-endpoint-group-conditions {
+ description
+ "Set a list of conditions for a particular endpoint group.
+ These conditions will apply to all endpoints in the
+ endpoint group. These conditions will be added to the
+ existing list of conditions.";
+
+ input {
+ uses has-endpoint-group-conditions;
+ }
+ }
+
+ rpc unset-endpoint-group-conditions {
+ description
+ "Remove a list of conditions from an endpoint group.";
+
+ input {
+ uses has-endpoint-group-conditions;
+ }
+ }
}