Skip to content

Commit

Permalink
Add draft security objects to vRO inventory
Browse files Browse the repository at this point in the history
Change-Id: Iae43e4fa413b967441f34fca898efc48195a2681
Partial-bug: #1784886
  • Loading branch information
IridiumOxide committed Aug 6, 2018
1 parent a3dd3e0 commit bf68ef3
Show file tree
Hide file tree
Showing 6 changed files with 135 additions and 3 deletions.
Expand Up @@ -29,11 +29,21 @@ object Networking : CategoryType()
object Services : CategoryType()
object Security : CategoryType()

// project-level draft security object
object DraftSecurity {
val name = "Draft Security"
}

// top level security object
object GlobalSecurity {
val name = Security.name
}

// top level draft security object
object GlobalDraftSecurity {
val name = DraftSecurity.name
}

val Class<*>.category get() = when (this) {

VirtualNetwork::class.java,
Expand Down
Expand Up @@ -11,6 +11,8 @@ 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 net.juniper.contrail.vro.config.GlobalDraftSecurity
import net.juniper.contrail.vro.config.DraftSecurity
import net.juniper.contrail.vro.config.GlobalSecurity
import org.springframework.beans.factory.annotation.Autowired

Expand All @@ -34,6 +36,20 @@ class GlobalSecurityFinder : ObjectFinder<GlobalSecurity>
override fun query(ctx: PluginContext, type: String, query: String) = null
}

class GlobalDraftSecurityFinder : ObjectFinder<GlobalDraftSecurity>
{
override fun assignId(security: GlobalDraftSecurity, id: Sid) = id
override fun find(ctx: PluginContext, type: String, id: Sid) = GlobalDraftSecurity
override fun query(ctx: PluginContext, type: String, query: String) = null
}

class DraftSecurityFinder : ObjectFinder<DraftSecurity>
{
override fun assignId(security: DraftSecurity, id: Sid) = id
override fun find(ctx: PluginContext, type: String, id: Sid) = DraftSecurity
override fun query(ctx: PluginContext, type: String, query: String) = null
}

class IpamSubnetTypeFinder
@Autowired constructor(private val connectionRepository: ConnectionRepository) : ObjectFinder<IpamSubnetType>
{
Expand Down
Expand Up @@ -10,6 +10,7 @@ import com.vmware.o11n.sdk.modeldriven.Sid
import net.juniper.contrail.api.types.IpamSubnetType
import net.juniper.contrail.api.types.NetworkIpam
import net.juniper.contrail.vro.base.ConnectionRepository
import net.juniper.contrail.vro.config.GlobalDraftSecurity
import net.juniper.contrail.vro.config.GlobalSecurity
import org.springframework.beans.factory.annotation.Autowired

Expand All @@ -26,6 +27,12 @@ class ConnectionHasGlobalSecurity : ObjectRelater<GlobalSecurity>
listOf(GlobalSecurity)
}

class ConnectionHasGlobalDraftSecurity : ObjectRelater<GlobalDraftSecurity>
{
override fun findChildren(ctx: PluginContext, relation: String, parentType: String, id: Sid) =
listOf(GlobalDraftSecurity)
}

class NetworkIpamToSubnet @Autowired
constructor(private val connectionRepository: ConnectionRepository) : ObjectRelater<IpamSubnetType>
{
Expand Down
Expand Up @@ -5,10 +5,14 @@
package net.juniper.contrail.vro.format

import net.juniper.contrail.api.ApiObjectBase
import net.juniper.contrail.api.types.AddressGroup
import net.juniper.contrail.api.types.ApplicationPolicySet
import net.juniper.contrail.api.types.FirewallPolicy
import net.juniper.contrail.api.types.FirewallRule
import net.juniper.contrail.api.types.FloatingIp
import net.juniper.contrail.api.types.IpamSubnetType
import net.juniper.contrail.api.types.QuotaType
import net.juniper.contrail.api.types.ServiceGroup
import net.juniper.contrail.api.types.Subnet
import net.juniper.contrail.api.types.Tag
import net.juniper.contrail.vro.format.PropertyFormatter.format
Expand Down Expand Up @@ -37,8 +41,13 @@ object DisplayNameFormatter {
if (obj.parentType == "project") "${obj.parentName}: ${obj.name}" else "global: ${obj.name}"

fun format(obj: FirewallRule): String? {
// `obj.parent?.name` returns null, so we use `obj.qualifiedName.dropLast(1).last()` to get the parent name.
val parentName = obj.parentName.let { if (it == "default-policy-management") "global" else it }
val draftState = draftState(obj.draftModeState)
// for draft rules, we need to determine the draft-policy-management's parent.
val parentName = when (obj.parentName) {
"default-policy-management" -> "global"
"draft-policy-management" -> obj.grandparentName ?: "global"
else -> obj.parentName
}
val simpleAction = obj.actionList?.simpleAction
val direction = obj.direction
val serviceGroup = obj.serviceGroup.run {
Expand All @@ -47,10 +56,31 @@ object DisplayNameFormatter {
val service = if (obj.service != null && obj.service.protocol != null) format(obj.service) else serviceGroup
val endpoint1 = format(obj.endpoint1)
val endpoint2 = format(obj.endpoint2)
return "$parentName: $simpleAction $service EP1: $endpoint1 $direction EP2: $endpoint2"
return "$draftState$parentName: $simpleAction $service EP1: $endpoint1 $direction EP2: $endpoint2"
}

fun format(obj: FirewallPolicy): String? =
"${draftState(obj.draftModeState)}${obj.name}"

fun format(obj: ApplicationPolicySet): String? =
"${draftState(obj.draftModeState)}${obj.name}"

fun format(obj: ServiceGroup): String? =
"${draftState(obj.draftModeState)}${obj.name}"

fun format(obj: AddressGroup): String? =
"${draftState(obj.draftModeState)}${obj.name}"

// requires no space before next word
private fun draftState(draftModeState: String?): String {
draftModeState ?: return ""
return "[DRAFT ($draftModeState)] "
}

// `obj.parent?.name` returns null, so we extract the parent name from the qualified name.
private val ApiObjectBase.parentName get() =
qualifiedName.dropLast(1).last()

private val ApiObjectBase.grandparentName get() =
qualifiedName.dropLast(2).lastOrNull()
}
Expand Up @@ -67,6 +67,20 @@ class CustomMapping: AbstractMapping() {
<#-- Re-use security icon -->
.withIcon(findFolderIcon<Security>())

wrap(GlobalDraftSecurity::class.java)
.unconstructible()
.andFind()
.using(GlobalDraftSecurityFinder::class.java)
<#-- Re-use security icon -->
.withIcon(findFolderIcon<Security>())

wrap(DraftSecurity::class.java)
.unconstructible()
.andFind()
.using(DraftSecurityFinder::class.java)
<#-- Re-use security icon -->
.withIcon(findFolderIcon<Security>())

<#list categories as category>
wrap(${category.name}::class.java)
.unconstructible()
Expand Down Expand Up @@ -115,6 +129,11 @@ class CustomMapping: AbstractMapping() {
.using(ConnectionHasGlobalSecurity::class.java)
.`as`("ConnectionHasGlobalSecurity")

relate(Connection::class.java)
.to(GlobalDraftSecurity::class.java)
.using(ConnectionHasGlobalDraftSecurity::class.java)
.`as`("ConnectionHasGlobalDraftSecurity")

<#list rootClasses as rootClass>
relate(Connection::class.java)
.to(${rootClass.simpleName}::class.java)
Expand All @@ -129,13 +148,32 @@ class CustomMapping: AbstractMapping() {
.using(GlobalSecurityHas${klass.simpleName}::class.java)
.`as`("GlobalSecurityHas${klass.pluginName}")
.`in`(FolderDef(folderName("${klass.folderName}", "GlobalSecurity"), findFolderIcon<${klass.simpleName}>()))

relate(GlobalDraftSecurity::class.java)
.to(${klass.simpleName}::class.java)
.using(GlobalDraftSecurityHas${klass.simpleName}::class.java)
.`as`("GlobalDraftSecurityHas${klass.pluginName}")
.`in`(FolderDef(folderName("Draft ${klass.folderName}", "GlobalDraftSecurity"), findFolderIcon<${klass.simpleName}>()))

relate(DraftSecurity::class.java)
.to(${klass.simpleName}::class.java)
.using(ProjectHasDraft${klass.simpleName}::class.java)
.`as`("ProjectHasDraft${klass.pluginName}")
.`in`(FolderDef(folderName("Draft ${klass.folderName}", "Project"), findFolderIcon<${klass.simpleName}>()))

</#list>

<#list categories as category>
relate(${category.parentName}::class.java)
.to(${category.name}::class.java)
.using(${category.parentName}Has${category.name}::class.java)
.`as`("${category.parentPluginName}Has${category.name}")
<#if category.name == "Security">
relate(Project::class.java)
.to(DraftSecurity::class.java)
.using(ProjectHasDraftSecurity::class.java)
.`as`("ProjectHasDraftSecurity")
</#if>
</#list>

<#list categoryRelations as relation>
Expand Down
Expand Up @@ -40,6 +40,21 @@ class ${relation.parentName}Has${relation.childName}
</#list>

<#list securityClasses as klass>

class ProjectHasDraft${klass.simpleName}
@Autowired constructor(private val connections: ConnectionRepository) : ObjectRelater<${klass.simpleName}> {

override fun findChildren(ctx: PluginContext, relation: String, parentType: String, parentId: Sid): List<${klass.simpleName}>? {
val connection = connections.getConnection(parentId)
val parentProject = connection?.findById<Project>(parentId.getString("Project"))
val draftFqn = parentProject?.qualifiedName?.plus("draft-policy-management")?.joinToString(":")
val parent = draftFqn?.run {
connection.findByFQN<PolicyManagement>(this)
}
return connection?.getObjects(${klass.simpleName}::class.java, parent?.${klass.simpleNameDecapitalized}s)
}
}

class GlobalSecurityHas${klass.simpleName}
@Autowired constructor(private val connections: ConnectionRepository) : ObjectRelater<${klass.simpleName}> {

Expand All @@ -50,8 +65,24 @@ class GlobalSecurityHas${klass.simpleName}
}
}

class GlobalDraftSecurityHas${klass.simpleName}
@Autowired constructor(private val connections: ConnectionRepository) : ObjectRelater<${klass.simpleName}> {

override fun findChildren(ctx: PluginContext, relation: String, parentType: String, parentId: Sid): List<${klass.simpleName}>? {
val connection = connections.getConnection(parentId)
val parent = connection?.findByFQN<PolicyManagement>("draft-policy-management")
return connection?.getObjects(${klass.simpleName}::class.java, parent?.${klass.simpleNameDecapitalized}s)
}
}

</#list>

class ProjectHasDraftSecurity: ObjectRelater<DraftSecurity> {

override fun findChildren(ctx: PluginContext, relation: String, parentType: String, parentId: Sid): List<DraftSecurity> =
listOf(DraftSecurity)
}

<#list categories as category>
class ${category.parentName}Has${category.name}: ObjectRelater<${category.name}> {

Expand Down

0 comments on commit bf68ef3

Please sign in to comment.