Skip to content

Commit

Permalink
Restored realtion between IPAM and network. Custom formatting for Ipa…
Browse files Browse the repository at this point in the history
…mSubnetType

Change-Id: Iaf9893550dc941b17688b3cc7a9d001521172aef
Closes-Bug: #1763449
  • Loading branch information
magdalena-zaremba committed Apr 17, 2018
1 parent 09e490b commit 0d0af3b
Show file tree
Hide file tree
Showing 28 changed files with 192 additions and 98 deletions.
5 changes: 3 additions & 2 deletions o11nplugin-contrail-config/buildNumber.properties
@@ -1,3 +1,4 @@
#maven.buildNumber.plugin properties file
#Wed Apr 11 14:48:29 CEST 2018
buildNumber=1249

#Thu Apr 12 17:03:38 CEST 2018
buildNumber=1255
Expand Up @@ -30,5 +30,6 @@ val serviceHasInterfaceWithName = "serviceHasInterfaceWithName"
val subnetsOfVirtualNetwork = "subnetsOfVirtualNetwork"
val templateHasInterfaceWithName = "templateHasInterfaceWithName"
val serviceInstanceInterfaceNames = "serviceInstanceInterfaceNames"
val ipamHasAllcationMode = "ipamHasAllocationMode"
val ipamHasAllocationMode = "ipamHasAllocationMode"
val ipamHasNotAllocationMode = "ipamHasNotAllocationMode"
val networkHasNotAllcationMode = "networkHasNotAllocationMode"
Expand Up @@ -10,7 +10,6 @@ import net.juniper.contrail.api.types.* // ktlint-disable no-wildcard-imports
val modelClasses = setOf(
the<Project>(),
the<VirtualNetwork>(),
the<Subnet>(),
the<NetworkIpam>(),
the<FloatingIp>(),
the<FloatingIpPool>(),
Expand Down Expand Up @@ -80,6 +79,7 @@ val mandatoryReference = setOf(

val nonEditableReference = setOf(
pair<VirtualMachineInterface, VirtualNetwork>(),
pair<VirtualNetwork, NetworkIpam>(),
pair<ServiceInstance, ServiceTemplate>()
)

Expand All @@ -100,7 +100,6 @@ val hiddenRoots = setOf(

val hiddenRelations = setOf(
pair<FloatingIp, Project>(),
pair<VirtualNetwork, NetworkIpam>(),
pair<VirtualMachineInterface, PortTuple>(),
pair<ServiceTemplate, ServiceApplianceSet>()
)
Expand All @@ -109,6 +108,10 @@ val reversedRelations = setOf(
pair<FloatingIp, VirtualMachineInterface>()
)

val propertiesAsObjects = setOf(
the<IpamSubnetType>()
)

private inline fun <reified T> the() =
T::class.java.simpleName

Expand Down Expand Up @@ -145,6 +148,9 @@ val String.isDirectChild get() =
val String.isHiddenRoot get() =
hiddenRoots.contains(this)

val String.isApiPropertyAsObject get() =
propertiesAsObjects.contains(this)

fun ObjectClass.isRelationMandatory(child: ObjectClass) =
mandatoryReference.containsUnordered(simpleName, child.simpleName)

Expand Down Expand Up @@ -195,6 +201,12 @@ val Class<*>.isDirectChild get() =
val Class<*>.isHiddenRoot get() =
simpleName.isHiddenRoot

val Class<*>.isNodeClass get() =
isApiObjectClass || isApiPropertyAsObject

val Class<*>.isApiPropertyAsObject get() =
simpleName.isApiPropertyAsObject

val ObjectClass.isInternal get() =
!hasParents

Expand Down
Expand Up @@ -8,7 +8,6 @@ val hiddenProperties = setOf(
"parentUuid",
"parentType",
"idPerms",
"ipamSubnets",
"annotations"
)

Expand All @@ -25,6 +24,7 @@ val String.isHiddenProperty get() =

val String.displayedName get() = when (this) {
"ipamSubnetMethod" -> "Subnet Method"
"ipamSubnets" -> "Subnets"
else -> camelChunks.joinToString(" ") { it.cleanOrRename.capitalize() }
}

Expand Down
Expand Up @@ -5,7 +5,6 @@
package net.juniper.contrail.vro.model

import net.juniper.contrail.api.types.IpamSubnetType
import net.juniper.contrail.api.types.Subnet
import net.juniper.contrail.api.types.VirtualNetwork
import net.juniper.contrail.api.types.InstanceIp
import net.juniper.contrail.api.types.VirtualMachineInterface
Expand All @@ -18,10 +17,6 @@ class Executor(private val connection: Connection) {
return ipams.asSequence().map { it.attr.ipamSubnets.asSequence().filterNotNull() }.flatten().toList()
}

fun IpamSubnetType.subnet(): Subnet? {
return connection.findById(subnetUuid)
}

// InstanceIp should be in 1-1 relation to VMI, so only first element is chosen if it exists
fun VirtualMachineInterface.instanceIp(): InstanceIp? =
instanceIpBackRefs?.getOrNull(0)?.uuid?.let { connection.findById(it) }
Expand Down
Expand Up @@ -8,6 +8,8 @@ import com.vmware.o11n.sdk.modeldriven.FoundObject
import com.vmware.o11n.sdk.modeldriven.ObjectFinder
import com.vmware.o11n.sdk.modeldriven.PluginContext
import com.vmware.o11n.sdk.modeldriven.Sid
import net.juniper.contrail.api.types.IpamSubnetType
import net.juniper.contrail.api.types.VirtualNetwork
import net.juniper.contrail.vro.base.ConnectionRepository
import org.springframework.beans.factory.annotation.Autowired

Expand All @@ -22,4 +24,21 @@ class ConnectionFinder

override fun query(ctx: PluginContext, type: String, query: String): List<FoundObject<Connection>> =
connectionRepository.findConnections(query).map { FoundObject<Connection>(it, it.info.sid) }
}

class IpamSubnetTypeFinder
@Autowired constructor(private val connectionRepository: ConnectionRepository) : ObjectFinder<IpamSubnetType>
{
override fun assignId(subnet: IpamSubnetType, id: Sid): Sid =
id.with("IpamSubnet", subnet.subnetUuid)

override fun find(ctx: PluginContext, type: String, id: Sid): IpamSubnetType? {
val connection = connectionRepository.getConnection(id)
val subnetUuid = id.getString("IpamSubnet") ?: return null
val parent = connection?.find<VirtualNetwork>(id) ?: return null
return parent.networkIpam.asSequence().flatMap { it.attr.ipamSubnets.asSequence() }.find { it.subnetUuid == subnetUuid }
}

override fun query(ctx: PluginContext, type: String, query: String): List<FoundObject<IpamSubnetType>>? =
null
}
Expand Up @@ -7,8 +7,8 @@ package net.juniper.contrail.vro.model
import com.vmware.o11n.sdk.modeldriven.ObjectRelater
import com.vmware.o11n.sdk.modeldriven.PluginContext
import com.vmware.o11n.sdk.modeldriven.Sid
import net.juniper.contrail.api.types.Subnet
import net.juniper.contrail.api.types.VirtualNetwork
import net.juniper.contrail.api.types.IpamSubnetType
import net.juniper.contrail.api.types.NetworkIpam
import net.juniper.contrail.vro.base.ConnectionRepository
import org.springframework.beans.factory.annotation.Autowired

Expand All @@ -19,14 +19,15 @@ constructor(private val connectionRepository: ConnectionRepository) : ObjectRela
connectionRepository.connections
}

class VirtualNetworkHasSubnet @Autowired
constructor(private val connectionRepository: ConnectionRepository) : ObjectRelater<Subnet>
class NetworkIpamHasSubnet @Autowired
constructor(private val connectionRepository: ConnectionRepository) : ObjectRelater<IpamSubnetType>
{
override fun findChildren(ctx: PluginContext, relation: String, parentType: String, id: Sid): List<Subnet>? {
override fun findChildren(ctx: PluginContext, relation: String, parentType: String, id: Sid): List<IpamSubnetType>? {
val vnId = id.getString("VirtualNetwork") ?: return null
val connection = connectionRepository.getConnection(id) ?: return null
val ipams = connection.find<VirtualNetwork>(id)?.networkIpam ?: return null
return ipams.asSequence().map {
it.attr.ipamSubnets.asSequence().map { connection.findById<Subnet>(it.subnetUuid) }.filterNotNull()
}.flatten().toList()
val ipam = connection.find<NetworkIpam>(id) ?: return null
if (ipam.ipamSubnetMethod == "flat-subnet") return null
return ipam.virtualNetworkBackRefs.asSequence().filter { it.uuid == vnId }
.flatMap { it.attr.ipamSubnets.asSequence() }.toList()
}
}
Expand Up @@ -121,11 +121,12 @@ class Utils {

fun removeSubnetFromVirtualNetwork(network: VirtualNetwork, subnet: String) {
val ipams = network.networkIpam ?: return
val index = subnet.split(":")[0].toInt()
val ipamSubnet = ipams.flatMap { it.attr.ipamSubnets.filterNotNull() } [index]
val ipPrefix = parseSubnetIP(subnet)
val ipPrefixLen = parseSubnetPrefix(subnet).toInt()

//first remove subnet from attributes
ipams.forEach {
it.attr.ipamSubnets.removeIf { it == ipamSubnet }
it.attr.ipamSubnets.removeIf { it.subnet.ipPrefix == ipPrefix && it.subnet.ipPrefixLen == ipPrefixLen }
}
//then remove IPAMs if have not subnets
ipams.removeIf {
Expand Down Expand Up @@ -273,12 +274,14 @@ class Utils {
return routeString.split(":")[0].toInt()
}

fun ipamSubnetToString(ipamSubnet: IpamSubnetType, index: Int): String = ipamSubnet.run {
"$index: CIDR ${subnet.ipPrefix}/${subnet.ipPrefixLen} Gateway $defaultGateway"
}
fun ipamSubnetToString(ipamSubnet: IpamSubnetType?): String? =
ipamSubnet?.run { "${subnet.ipPrefix}/${subnet.ipPrefixLen}" }

fun ipamSubnetStringToIndex(ipamSubnetString: String): Int =
ipamSubnetString.split(":")[0].toInt()
fun removeSubnetFromIpam(cidr: String, ipam : NetworkIpam) {
val ipPrefix = parseSubnetIP(cidr)
val ipPrefixLen = parseSubnetPrefix(cidr).toInt()
ipam.ipamSubnets.subnets.removeIf { it.subnet.ipPrefix == ipPrefix && it.subnet.ipPrefixLen == ipPrefixLen }
}

fun lowercase(s: String) =
s.toLowerCase()
Expand Down
@@ -0,0 +1,13 @@
/*
* Copyright (c) 2018 Juniper Networks, Inc. All rights reserved.
*/

package net.juniper.contrail.vro

sealed class AdditionalProperty(val propertyName: String) {
val methodName = "get${propertyName.capitalize()}"
}

object DisplayNameProperty : AdditionalProperty("displayName")

val propertyAsObjectNewProperties = listOf(DisplayNameProperty)
Expand Up @@ -13,6 +13,8 @@ import net.juniper.contrail.api.ApiObjectBase
import net.juniper.contrail.vro.config.ObjectClass
import net.juniper.contrail.vro.config.constants.apiTypesPackageName
import net.juniper.contrail.vro.config.isApiObjectClass
import net.juniper.contrail.vro.config.isNodeClass
import net.juniper.contrail.vro.config.isApiPropertyAsObject
import net.juniper.contrail.vro.config.isApiPropertyClass
import net.juniper.contrail.vro.config.isGetter
import net.juniper.contrail.vro.config.isHiddenProperty
Expand Down Expand Up @@ -112,6 +114,9 @@ class CustomManagedType(private val delegate: ManagedType) : ManagedType() {
val isObjectClass get() =
delegate.modelClass?.isApiObjectClass ?: false

val isNodeClass get() =
delegate.modelClass?.isNodeClass ?: false

val isConnectionChild get() =
delegate.modelClass?.let {
if (it.isSubclassOf<ApiObjectBase>()) {
Expand Down Expand Up @@ -150,6 +155,13 @@ class CustomManagedType(private val delegate: ManagedType) : ManagedType() {
null
} ?: emptyList()

val customProperties: List<AdditionalProperty> = delegate.modelClass?.run {
if (isApiPropertyAsObject)
propertyAsObjectNewProperties
else
null
} ?: emptyList()

val propertyViews: List<CustomProperty> = delegate.modelClass?.run {
if (isApiObjectClass)
methods.asSequence()
Expand All @@ -168,6 +180,7 @@ class CustomManagedType(private val delegate: ManagedType) : ManagedType() {
generateReferenceMethods()
generatePropertyMethods()
generateReferencePropertiesMethods()
generateCustomProperties()
}

private fun removeDuplicateMethods() {
Expand Down Expand Up @@ -197,6 +210,9 @@ class CustomManagedType(private val delegate: ManagedType) : ManagedType() {
private fun generateReferenceMethods() =
references.forEach { methods.add(it.toManagedMethod()) }

private fun generateCustomProperties() =
customProperties.forEach { methods.add(it.toManagedMethod()) }

private fun generateReferencePropertiesMethods() =
referenceProperties.forEach { methods.add(it.toManagedMethod()) }

Expand Down Expand Up @@ -252,6 +268,16 @@ class CustomManagedType(private val delegate: ManagedType) : ManagedType() {
isWrapped = false
}

private fun AdditionalProperty.toManagedMethod() = ManagedMethod().apply {
setName(methodName, methodName)
propertyName = this@toManagedMethod.propertyName
originalPropertyName = this@toManagedMethod.propertyName
params = emptyList()
setIsInheritedWrapperMethod(true)
isPropertyReadOnly = true
returns = stringReturnFormalParameter()
}

companion object {

fun wrap(type: ManagedType): CustomManagedType {
Expand Down
Expand Up @@ -8,14 +8,14 @@ import com.vmware.o11n.sdk.modeldrivengen.model.Attribute
import com.vmware.o11n.sdk.modeldrivengen.model.ManagedFinder
import com.vmware.o11n.sdk.modeldrivengen.model.ManagedType
import com.vmware.o11n.sdk.modeldrivengen.model.Plugin
import net.juniper.contrail.vro.config.refWrapperPropertyDisplayName
import net.juniper.contrail.vro.config.cleanedDisplayedProperty
import net.juniper.contrail.vro.config.displayedName
import net.juniper.contrail.vro.config.isRefWrapperProperty
import net.juniper.contrail.vro.config.isApiTypeClass
import net.juniper.contrail.vro.config.isCapitalized
import net.juniper.contrail.vro.config.isDisplayOnlyProperty
import net.juniper.contrail.vro.config.isModelClass
import net.juniper.contrail.vro.config.position
import net.juniper.contrail.vro.config.cleanedDisplayedProperty
import net.juniper.contrail.vro.config.isRefWrapperProperty
import net.juniper.contrail.vro.config.refWrapperPropertyDisplayName
import net.juniper.contrail.vro.config.displayedName

class CustomPlugin : Plugin() {

Expand Down Expand Up @@ -47,7 +47,7 @@ class CustomPlugin : Plugin() {

private fun cleanFinders(finders: MutableList<ManagedFinder>) {
finders.asSequence()
.filter { it.managedType?.modelClass?.isModelClass ?: false }
.filter { it.managedType?.modelClass?.isApiTypeClass ?: false }
.forEach { it.clean() }
}

Expand Down
Expand Up @@ -217,10 +217,6 @@ public class ${className}

</#list>

public String getDisplayName() {
return DisplayNameFormatter.INSTANCE.format(__getTarget());
}

<#list references as ref>
//List returned by this method is read-only. Changes to the list will not be reflected in the state of the object.
public java.util.List<${ref.className}_Wrapper> ${ref.pluginMethodName}() {
Expand All @@ -235,6 +231,13 @@ public class ${className}
</#list>
</#if>

<#if nodeClass >
public String getDisplayName() {
return DisplayNameFormatter.INSTANCE.format(__getTarget());
}
</#if>


<#list propertyViews as property>
public String ${property.viewMethodName}() {
${property.propertyType} prop = __getTarget().${property.methodName}();
Expand Down
Expand Up @@ -6,6 +6,7 @@ package net.juniper.contrail.vro.format

import net.juniper.contrail.api.ApiObjectBase
import net.juniper.contrail.api.types.FloatingIp
import net.juniper.contrail.api.types.IpamSubnetType
import net.juniper.contrail.api.types.Subnet

/**
Expand All @@ -21,4 +22,7 @@ object DisplayNameFormatter {

fun format(obj: ApiObjectBase):String? =
obj.name

fun format(obj: IpamSubnetType): String? =
obj.subnet?.let { PropertyFormatter.format(it) }
}

0 comments on commit 0d0af3b

Please sign in to comment.