Skip to content

Commit

Permalink
Add global config edit workflow
Browse files Browse the repository at this point in the history
Change-Id: I467af8d28f554bce6f7a13385a6e8df7d114b86f
Closes-bug: #1797594
  • Loading branch information
IridiumOxide committed Oct 12, 2018
1 parent bb311ea commit ff77473
Show file tree
Hide file tree
Showing 12 changed files with 172 additions and 12 deletions.
4 changes: 2 additions & 2 deletions o11nplugin-contrail-config/buildNumber.properties
@@ -1,3 +1,3 @@
#maven.buildNumber.plugin properties file
#Tue Oct 09 16:35:36 CEST 2018
buildNumber=1855
#Fri Oct 12 16:45:51 CEST 2018
buildNumber=1891
Expand Up @@ -29,6 +29,10 @@ object Networking : CategoryType()
object Services : CategoryType()
object Security : CategoryType()

object Configuration {
val name = "Configuration"
}

// project-level draft security object
object DraftSecurity {
val name = "Draft Security"
Expand All @@ -45,7 +49,6 @@ object GlobalDraftSecurity {
}

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

VirtualNetwork::class.java,
VirtualMachineInterface::class.java,
NetworkIpam::class.java,
Expand Down
Expand Up @@ -15,6 +15,8 @@ import net.juniper.contrail.api.types.FirewallRuleEndpointType
import net.juniper.contrail.api.types.FirewallServiceType
import net.juniper.contrail.api.types.FloatingIp
import net.juniper.contrail.api.types.FloatingIpPool
import net.juniper.contrail.api.types.GlobalSystemConfig
import net.juniper.contrail.api.types.GlobalVrouterConfig
import net.juniper.contrail.api.types.IdPermsType
import net.juniper.contrail.api.types.InstanceIp
import net.juniper.contrail.api.types.IpamSubnetType
Expand Down Expand Up @@ -65,7 +67,9 @@ val defaultContext = ConfigContext(
the<FirewallPolicy>(),
the<FirewallRule>(),
the<ServiceGroup>(),
the<AddressGroup>()
the<AddressGroup>(),
the<GlobalSystemConfig>(),
the<GlobalVrouterConfig>()
),

inventoryProperties = setOf(
Expand Down Expand Up @@ -111,7 +115,9 @@ val defaultContext = ConfigContext(
the<PolicyManagement>(),
the<Tag>(),
the<TagType>(),
the<FirewallRule>()
the<FirewallRule>(),
the<GlobalSystemConfig>(),
the<GlobalVrouterConfig>()
),

customEditWorkflows = setOf(
Expand All @@ -122,14 +128,18 @@ val defaultContext = ConfigContext(
the<ServiceInstance>(),
the<PortTuple>(),
the<PolicyManagement>(),
the<FirewallRule>()
the<FirewallRule>(),
the<GlobalSystemConfig>(),
the<GlobalVrouterConfig>()
),

customDeleteWorkflows = setOf(
the<VirtualMachineInterface>(),
the<PortTuple>(),
the<PolicyManagement>(),
the<TagType>()
the<TagType>(),
the<GlobalSystemConfig>(),
the<GlobalVrouterConfig>()
),

directChildren = setOf(
Expand Down Expand Up @@ -162,7 +172,8 @@ val defaultContext = ConfigContext(
),

hiddenRoots = setOf(
the<VirtualMachineInterface>()
the<VirtualMachineInterface>(),
the<GlobalSystemConfig>()
),

hiddenRelations = setOf(
Expand All @@ -175,7 +186,9 @@ val defaultContext = ConfigContext(
pair<Tag, TagType>(),
pair<FirewallRule, AddressGroup>(),
pair<FirewallRule, ServiceGroup>(),
pair<FirewallRule, VirtualNetwork>()
pair<FirewallRule, VirtualNetwork>(),
pair<ApplicationPolicySet, GlobalVrouterConfig>(),
pair<GlobalSystemConfig, GlobalVrouterConfig>()
),

tagRelations = setOf(
Expand Down
Expand Up @@ -31,4 +31,5 @@ const val createGlobalApplicationPolicySetWithFirewallPoliciesWorkflowName = "Cr
const val commitDraftsInProjectWorkflowName = "Commit drafts in project"
const val commitGlobalDraftsWorkflowName = "Commit global drafts"
const val discardDraftsInProjectWorkflowName = "Discard drafts in project"
const val discardGlobalDraftsWorkflowName = "Discard global drafts"
const val discardGlobalDraftsWorkflowName = "Discard global drafts"
const val editGlobalConfiguration = "Edit global configuration"
Expand Up @@ -5,6 +5,7 @@
package net.juniper.contrail.vro.model

import net.juniper.contrail.api.types.GlobalSystemConfig
import net.juniper.contrail.api.types.GlobalVrouterConfig
import net.juniper.contrail.api.types.IpamSubnetType
import net.juniper.contrail.api.types.VirtualNetwork
import net.juniper.contrail.api.types.InstanceIp
Expand All @@ -21,6 +22,9 @@ class Executor(private val connection: Connection) :
SecurityGroupRuleProperties by SecurityGroupRulePropertyExecutor(connection),
NetworkPolicyRuleProperties by NetworkPolicyRulePropertyExecutor(connection),
FirewallRuleComplexProperties by FirewallRuleComplexPropertyExecutor(connection) {
private val defaultGlobalSystemConfigFQN = "default-global-system-config"
private val defaultGlobalVrouterConfigFQN = "$defaultGlobalSystemConfigFQN:default-global-vrouter-config"

fun VirtualNetwork.subnets(): List<IpamSubnetType> {
val ipams = networkIpam ?: return emptyList()
return ipams.asSequence().map { it.attr.ipamSubnets.asSequence().filterNotNull() }.flatten().toList()
Expand Down Expand Up @@ -56,12 +60,17 @@ FirewallRuleComplexProperties by FirewallRuleComplexPropertyExecutor(connection)
fun Connection.listTagsOfType(tagType: String): List<Tag> =
list<Tag>()?.asSequence()?.filter { isTagOfType(it, tagType) }?.toList() ?: emptyList()

fun Connection.globalSystemConfig(): GlobalSystemConfig =
findByFQN(defaultGlobalSystemConfigFQN)!!

fun Connection.globalVrouterConfig(): GlobalVrouterConfig =
findByFQN(defaultGlobalVrouterConfigFQN)!!

private fun Connection.isTagOfType(tag: Tag, tagType: String): Boolean {
tag.typeName ?: read(tag)
return tag.typeName == tagType
}

private val defaultGlobalSystemConfigFQN = "default-global-system-config"
fun Connection.commitGlobalDrafts() {
val globalSystemConfig = findByFQN<GlobalSystemConfig>(defaultGlobalSystemConfigFQN)!!
commitDrafts(globalSystemConfig)
Expand Down
Expand Up @@ -11,6 +11,7 @@ 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.Configuration
import net.juniper.contrail.vro.config.GlobalDraftSecurity
import net.juniper.contrail.vro.config.DraftSecurity
import net.juniper.contrail.vro.config.GlobalSecurity
Expand Down Expand Up @@ -50,6 +51,13 @@ class DraftSecurityFinder : ObjectFinder<DraftSecurity>
override fun query(ctx: PluginContext, type: String, query: String) = null
}

class ConfigurationFinder : ObjectFinder<Configuration>
{
override fun assignId(security: Configuration, id: Sid) = id
override fun find(ctx: PluginContext, type: String, id: Sid) = Configuration
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.Configuration
import net.juniper.contrail.vro.config.GlobalDraftSecurity
import net.juniper.contrail.vro.config.GlobalSecurity
import org.springframework.beans.factory.annotation.Autowired
Expand All @@ -33,6 +34,12 @@ class ConnectionHasGlobalDraftSecurity : ObjectRelater<GlobalDraftSecurity>
listOf(GlobalDraftSecurity)
}

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

class NetworkIpamToSubnet @Autowired
constructor(private val connectionRepository: ConnectionRepository) : ObjectRelater<IpamSubnetType>
{
Expand Down
Expand Up @@ -63,6 +63,13 @@ class CustomMapping: AbstractMapping() {
.using(ConnectionFinder::class.java)
.withIcon("controller.png")

wrap(Configuration::class.java)
.unconstructible()
.andFind()
.using(ConfigurationFinder::class.java)
<#-- Re-use controller icon -->
.withIcon("controller.png")

wrap(GlobalSecurity::class.java)
.unconstructible()
.andFind()
Expand Down Expand Up @@ -137,6 +144,21 @@ class CustomMapping: AbstractMapping() {
.using(ConnectionHasGlobalDraftSecurity::class.java)
.`as`("ConnectionHasGlobalDraftSecurity")

relate(Connection::class.java)
.to(Configuration::class.java)
.using(ConnectionHasConfiguration::class.java)
.`as`("ConnectionHasConfiguration")

relate(Configuration::class.java)
.to(GlobalSystemConfig::class.java)
.using(ConfigurationHasGlobalSystemConfig::class.java)
.`as`("ConfigurationHasGlobalSystemConfig")

relate(Configuration::class.java)
.to(GlobalVrouterConfig::class.java)
.using(ConfigurationHasGlobalVrouterConfig::class.java)
.`as`("ConfigurationHasGlobalVrouterConfig")

<#list rootClasses as rootClass>
relate(Connection::class.java)
.to(${rootClass.simpleName}::class.java)
Expand Down
Expand Up @@ -83,6 +83,26 @@ class ProjectHasDraftSecurity: ObjectRelater<DraftSecurity> {
listOf(DraftSecurity)
}

class ConfigurationHasGlobalSystemConfig
@Autowired constructor(private val connectionRepository: ConnectionRepository) : ObjectRelater<GlobalSystemConfig>
{
override fun findChildren(ctx: PluginContext, relation: String, parentType: String, id: Sid): List<GlobalSystemConfig>? {
val connection = connectionRepository.getConnection(id) ?: return null
val config = connection.findByFQN<GlobalSystemConfig>("default-global-system-config") ?: return null
return listOf(config)
}
}

class ConfigurationHasGlobalVrouterConfig
@Autowired constructor(private val connectionRepository: ConnectionRepository) : ObjectRelater<GlobalVrouterConfig>
{
override fun findChildren(ctx: PluginContext, relation: String, parentType: String, id: Sid): List<GlobalVrouterConfig>? {
val connection = connectionRepository.getConnection(id) ?: return null
val config = connection.findByFQN<GlobalVrouterConfig>("default-global-system-config:default-global-vrouter-config") ?: return null
return listOf(config)
}
}

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

Expand Down
Expand Up @@ -14,7 +14,7 @@ import org.springframework.web.client.RestTemplate

fun authorizationHttpHeader(): HttpEntity<Any> {
val httpHeaders = HttpHeaders()
httpHeaders.add("Authorization", "Basic YWRtaW5pc3RyYXRvckB2c3BoZXJlLmxvY2FsOlZNd2FyZTEh")
httpHeaders.add("Authorization", "Basic YWRtaW5pc3RyYXRvckB2c3BoZXJlLmxvY2FsOkFiY2QxMjM0IQ==")
return HttpEntity(httpHeaders)
}

Expand Down
@@ -0,0 +1,9 @@
var globalSystemConfig = parentConnection.globalSystemConfig();
var globalVrouterConfig = parentConnection.globalVrouterConfig();

globalSystemConfig.setEnableSecurityPolicyDraft(enableSecurityPolicyDraft);
globalVrouterConfig.setEncapsulationPriorities(new ContrailEncapsulationPrioritiesType(encapsulationPriorities));
globalVrouterConfig.setForwardingMode(forwardingMode);

globalVrouterConfig.update();
globalSystemConfig.update();
@@ -0,0 +1,68 @@
package net.juniper.contrail.vro.workflows.custom

import net.juniper.contrail.api.types.GlobalSystemConfig
import net.juniper.contrail.api.types.GlobalVrouterConfig
import net.juniper.contrail.vro.config.constants.Connection
import net.juniper.contrail.vro.config.constants.editGlobalConfiguration
import net.juniper.contrail.vro.config.defaultConnection
import net.juniper.contrail.vro.config.parentConnection
import net.juniper.contrail.vro.schema.Schema
import net.juniper.contrail.vro.schema.propertyDescription
import net.juniper.contrail.vro.schema.simpleTypeConstraints
import net.juniper.contrail.vro.workflows.dsl.FromComplexPropertyValue
import net.juniper.contrail.vro.workflows.dsl.WhenNonNull
import net.juniper.contrail.vro.workflows.dsl.WorkflowDefinition
import net.juniper.contrail.vro.workflows.dsl.fromAction
import net.juniper.contrail.vro.workflows.dsl.inCategory
import net.juniper.contrail.vro.workflows.dsl.workflow
import net.juniper.contrail.vro.workflows.model.ParameterType
import net.juniper.contrail.vro.workflows.model.array
import net.juniper.contrail.vro.workflows.model.boolean
import net.juniper.contrail.vro.workflows.model.reference
import net.juniper.contrail.vro.workflows.model.string

val securityDraftModeParameterName = "enableSecurityPolicyDraft"
val encapsulationPrioritiesParameterName = "encapsulationPriorities"
val forwardingModeParameterName = "forwardingMode"
val encapsulationPredefinedAnswers = listOf("MPLSoGRE", "MPLSoUDP", "VXLAN")

internal fun editGlobalConfig(schema: Schema): WorkflowDefinition =
workflow(editGlobalConfiguration).withScriptFile("editGlobalConfig") {
step("Connection") {
parameter(parentConnection, Connection.reference) {
description = "Contrail controller whose config will be changed"
mandatory = true
dataBinding = fromAction(defaultConnection, type) {}
}
}
step("System config") {
visibility = WhenNonNull(parentConnection)
parameter(securityDraftModeParameterName, boolean) {
description = schema.propertyDescription<GlobalSystemConfig>(securityDraftModeParameterName)
mandatory = true
dataBinding = globalSystemConfigParameter(parentConnection, securityDraftModeParameterName, boolean)
}
}
step("Virtual Routers config") {
visibility = WhenNonNull(parentConnection)
parameter(encapsulationPrioritiesParameterName, array(string)) {
description = schema.propertyDescription<GlobalVrouterConfig>(encapsulationPrioritiesParameterName)
// for some reason, trying to extract these from schema returns an error
predefinedAnswers = encapsulationPredefinedAnswers
dataBinding = globalVrouterConfigParameter(parentConnection, "$encapsulationPrioritiesParameterName.encapsulation", array(string))
mandatory = true
}
parameter(forwardingModeParameterName, string) {
description = schema.propertyDescription<GlobalVrouterConfig>(forwardingModeParameterName)
additionalQualifiers += schema.simpleTypeConstraints<GlobalVrouterConfig>(forwardingModeParameterName)
dataBinding = globalVrouterConfigParameter(parentConnection, forwardingModeParameterName, string)
mandatory = true
}
}
}.inCategory("Global Configuration")

private fun <T : Any> globalSystemConfigParameter(connectionParam: String, parameterName: String, type: ParameterType<T>) =
FromComplexPropertyValue(connectionParam, "globalSystemConfig().$parameterName", type)

private fun <T : Any> globalVrouterConfigParameter(connectionParam: String, parameterName: String, type: ParameterType<T>) =
FromComplexPropertyValue(connectionParam, "globalVrouterConfig().$parameterName", type)

0 comments on commit ff77473

Please sign in to comment.