https://issues.apache.org/jira/browse/CLOUDSTACK-10189
Nuage VSD managed Isolated Network
Nuage VSD managed VPC
Nuage VSD managed Domain (VSD Enterprise)
Isolated networks
As a CloudStack operator
I want to provision a CloudStack Isolated Network based on a pre-existing Domain/Zone/Subnet in Nuage VSD (SDN policy manager)
In order to consume Nuage VSD side provisioning in CloudStack such that i can deploy VM’s in it, a.o.
This is achieved by specifying a new generic externalID attribute in the createNetwork request, allowing CloudStack operators to associate a network to an identifier to an entity known to external system. In the mentioned Nuage use case, the field can be set to a Subnet ID in the Nuage VSD, in order to associate the CloudStack created Network to this Nuage pre-created Subnet.
VPC’s
As a CloudStack operator
I want to provision a CloudStack VPC Tier Network based on a pre-existing Domain/Zone/Subnet in Nuage VSD (SDN policy manager)
In order to consume Nuage VSD side provisioning in CloudStack such that i can deploy VM’s in it, a.o. Note that the VPC itself it not VSD-managed as such; only the tiers are.
Similar to as for Isolated networks, the way this is achieved is by specifying a new externalID in the createNetwork request, which refers to the Subnet ID in VSD.
Domains
As a CloudStack operator
I want to provision a CloudStack Domain based on a pre-existing Enterprise in Nuage VSD (SDN policy manager)
In order to relate a CloudStack Domain to a pre-provisioned Enterprise in Nuage VSD
The way this is achieved is by specifying a UUID in the createDomain request, which refers to the Enterprise ID in VSD. The reason we use UUID here is because this is something existing already which we can perfectly reuse.
Isolated networks
added externalId attribute to createNetwork
Added externalId field to listNetworks response
VPC
see above mentioned change (no delta)
Domain
no API changes (existing field UUID is reused)
externalID added as optional field in the Create Network panel.
DomainId added as optional field in the create domain panel.
Database changes
We added a new column to the networks table. This column is named external_id and stores the externalId that is provided during the createNetwork cmd.
The feature makes use of the VSD ID caching framework i.e. the implementation relies on the fact that VSD object identifiers are already kept in memory cache in the CS plugin, and for VSD managed networking the design clue is that we pre-populate those ID’s based on config, rather than post-create when creating resources in VSD. We store the VSD subnet id in the externalId field which was added in the createNetworkCmd. In case of VSD managed domains we specify the UUID of the external object that maps on a domain in CloudStack as the uuid of the domain (we re-use already existing options in CS).
Core changes
We extended the NetworkGuruAdditionalFunctions interface. We added the extra parameter named externalId to the void finalizeNetworkDesign(long networkId, String vlanIdAsUUID, String externalId) function. This is necessary because during network creation we store vsd information linked to the network in the network_details table based on the externalId. The interface NetworkGuruAdditionalFunctions was already present and was previously used by nicira, now the Nuage plugin also implements this interface.
In the client, the VSD Id’s are contained in the NetworkRelatedVsdIds class.
API:
public Optional<String> getVsdEnterpriseId()
public Optional<String> getVsdDomainId()
public Optional<String> getVsdZoneId()
public Optional<String> getVsdSubnetId()
The NetworkRelatedVsdIds object is an attribute of VspNetwork, and will be read during NuageVspGuruClient.implement. Also NuageVspGuruClient.implement will return a NetworkRelatedVsdIds object with vsd id’s after implementation.
NuageVspEntityBuilder has been adapted to search the vsd Id’s in the metadata of the Network, and of the vpc, if the network is a vpc tier.
As part of NuageVspGuestNetworkGuru.implement(), the client is called,
And the VSD id’s returned by the client are stored in metadata again.
Metadata Key | Isolated network | VPC |
vsdDomainId | NetworkDetails | VpcDetails |
vsdZoneId | NetworkDetails | VpcDetails |
vsdSubnetId | NetworkDetails | NetworkDetails |
Besides implement, NuageVspGuruClient now also has a addPermissionL3Network method.
This method will be used in case the network is VSD Managed. This method checks if the network exists on the VSD, fetches it’s information and set correct permissions on the network.
TrashNetworkVspCommand: will return immediately when the trashed network is a vsdManaged network
CreateNetworkCmd now has a new attribute externalId, which - if present - will be stored in the NetworkVO object. After the network has been designed by the guru, if the guru implements NetworkGuruAdditionalFunctions, NetworkOrchestrator will call guru.finalizeNetworkDesign, passing the network id, and the specified externalId.
NuageVspGuestNetworkGuru now implements NetworkGuruAdditionalFunctions.
As part of finalizeNetworkDesign we will store the given externalId, as vsdSubnetId in metadata. An additional metadata tag is set on the network to flag is as Vsd Managed:
NetworkDetails: isVsdManaged = true
In current state, the changes done for Isolated Network, are good enough to be able to consume a VPC, by defined external Id as part of each tier creation.
The NetworkRelatedVsdIds returned by addPermissionL3Network will be stored as metadata, And the additional tiers, can make use of the cached id’s of the domain and zone.
Similar to TrashNetworkVspCommand, when executing ShutdownVpcCommand, the client won’t remove anything, when it’s vsd managed.
VSD managed domain
Nuage already created domains based on their uuid. In this case a user can just provide the uuid of a VSD enterprise (aka domain in CS). If the VSD enterprise already exist, the VSD will re-use it.
Important restriction: removed domains vsdDomains can not be added again in CloudStack. Because the uuid has to be unique and removed CloudStack objects are still present in the database.