Skip to content

Commit

Permalink
Allow finding API objects by ID through Connection wrapper. Add conne…
Browse files Browse the repository at this point in the history
…ction property to API object wrappers.

Change-Id: I8ea9a0a398fe9dc4357a8018456e61f7e79d7b41
Partial-Bug: #1767046
  • Loading branch information
danieljasinski committed Apr 26, 2018
1 parent c37f016 commit af6db32
Show file tree
Hide file tree
Showing 10 changed files with 58 additions and 19 deletions.
Expand Up @@ -4,10 +4,10 @@

package net.juniper.contrail.vro

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

object DisplayNameProperty : AdditionalProperty("displayName")
val displayNameProperty = AdditionalProperty("displayName")

val propertyAsObjectNewProperties = listOf(DisplayNameProperty)
val propertyAsObjectNewProperties get() = listOf(displayNameProperty)
Expand Up @@ -24,11 +24,13 @@ import net.juniper.contrail.vro.config.isModelClass
import net.juniper.contrail.vro.config.isPublic
import net.juniper.contrail.vro.config.isRootClass
import net.juniper.contrail.vro.config.isSubclassOf
import net.juniper.contrail.vro.config.modelClasses
import net.juniper.contrail.vro.config.parameterClass
import net.juniper.contrail.vro.config.pluginName
import net.juniper.contrail.vro.config.returnsApiPropertyOrList
import net.juniper.contrail.vro.config.returnsObjectReferences
import net.juniper.contrail.vro.config.setParentMethodsInModel
import net.juniper.contrail.vro.config.toPluginName
import net.juniper.contrail.vro.model.Connection
import net.juniper.contrail.vro.model.Executor
import java.lang.reflect.Method
Expand Down Expand Up @@ -109,11 +111,18 @@ private fun Class<*>.simpleParamConfig(parameter: FormalParameter) = parameter.a
typeName = canonicalName
}

class ClassInfo(val simpleName: String) {
val pluginName = simpleName.toPluginName
}

class CustomManagedType(private val delegate: ManagedType) : ManagedType() {

val isObjectClass get() =
delegate.modelClass?.isApiObjectClass ?: false

val isConnectionClass get() =
delegate.modelClass == Connection::class.java

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

Expand Down Expand Up @@ -155,6 +164,12 @@ class CustomManagedType(private val delegate: ManagedType) : ManagedType() {
null
} ?: emptyList()

val connectionFindClasses: List<ClassInfo> = if (isConnectionClass) {
modelClasses.map { ClassInfo(it) }
} else {
emptyList()
}

val customProperties: List<AdditionalProperty> = delegate.modelClass?.run {
if (isApiPropertyAsObject)
propertyAsObjectNewProperties
Expand Down
Expand Up @@ -25,7 +25,7 @@ public class ${className}
</@compress>

private static final long serialVersionUID = 1L;
<#if objectClass >
<#if objectClass || connectionClass >
private ReferenceFormatter formatter;
private WrapperUtil util;
</#if>
Expand All @@ -37,7 +37,7 @@ public class ${className}
<#else>
_ctx = new WrapperContext(ctx, null);
</#if>
<#if objectClass >
<#if objectClass || connectionClass >
BeanFactory beanFactory = _ctx.getPluginContext().getApplicationContext().getAutowireCapableBeanFactory();
ContrailPluginFactory factory = beanFactory.getBean(ContrailPluginFactory.class);
formatter = new ReferenceFormatter(factory);
Expand Down Expand Up @@ -192,6 +192,10 @@ public class ${className}
util.delete(getInternalId(), __getTarget());
}

public Connection_Wrapper getConnection() {
return (Connection_Wrapper) util.findConnectionWrapper(getInternalId());
}

<#list executorMethods as m>
<@compress single_line=true>public ${m.returns.typeName} ${m.name}(<@params m />)<@thrown m /> {</@compress>
<@locals m />
Expand Down Expand Up @@ -231,6 +235,13 @@ public class ${className}
</#list>
</#if>

<#list connectionFindClasses as clazz>
public ${clazz.simpleName}_Wrapper find${clazz.pluginName}(String id) {
return util.find(__getTarget(), ${clazz.simpleName}.class, id);
}

</#list>

<#if nodeClass >
public String getDisplayName() {
return DisplayNameFormatter.INSTANCE.format(__getTarget());
Expand Down
Expand Up @@ -22,10 +22,11 @@ class WrapperUtil(val ctx: WrapperContext, val factory: IPluginFactory) {
private fun <M> defaultList(): List<M> =
mutableListOf()

private fun maybeFindConnection(sid: Sid): Connection? {
val connectionWrapper = factory.find(ConnectionName, sid.toString()) as ModelWrapper?
return connectionWrapper?.__getTarget() as Connection?
}
fun findConnectionWrapper(id: Sid): ModelWrapper? =
factory.find(ConnectionName, id.toString()) as ModelWrapper?

private fun maybeFindConnection(sid: Sid): Connection? =
findConnectionWrapper(sid)?.__getTarget() as Connection?

private fun findConnection(sid: Sid): Connection =
maybeFindConnection(sid) ?: raiseNoConnection(sid)
Expand Down Expand Up @@ -58,6 +59,9 @@ class WrapperUtil(val ctx: WrapperContext, val factory: IPluginFactory) {
?: defaultList()
}

fun <T : ApiObjectBase, M: Findable> find(connection: Connection, clazz: Class<T>, id: String): M? =
connection.findById(clazz, id)?.also { connection.read(it) }?.toWrapper(connection.id, clazz)

private fun <T : ApiObjectBase, M : Findable> T.toWrapper(sid: Sid, clazz: Class<T>): M {
val wrapper: M = ctx.createPluginObject(this, clazz)
wrapper.internalId = sid.with(clazz.pluginName, uuid)
Expand Down
Expand Up @@ -6,7 +6,6 @@ package net.juniper.contrail.vro.generator.workflows

import net.juniper.contrail.vro.config.constants.child
import net.juniper.contrail.vro.config.constants.item
import net.juniper.contrail.vro.config.parentConnection
import net.juniper.contrail.vro.config.propertyValue
import net.juniper.contrail.vro.generator.model.ForwardRelation
import net.juniper.contrail.vro.workflows.dsl.WorkflowDefinition
Expand All @@ -17,6 +16,7 @@ import net.juniper.contrail.vro.workflows.dsl.asBrowserRoot
import net.juniper.contrail.vro.workflows.dsl.actionCallTo
import net.juniper.contrail.vro.workflows.model.reference
import net.juniper.contrail.vro.schema.Schema
import net.juniper.contrail.vro.workflows.dsl.parentConnection
import net.juniper.contrail.vro.workflows.util.addRelationWorkflowName
import net.juniper.contrail.vro.workflows.util.childDescriptionInCreateRelation
import net.juniper.contrail.vro.workflows.util.childDescriptionInRemoveRelation
Expand All @@ -35,13 +35,13 @@ fun addReferenceWorkflow(relation: ForwardRelation, schema: Schema): WorkflowDef
parameter(item, parentClass.reference) {
description = schema.parentDescriptionInCreateRelation(parentClass, childClass)
mandatory = true
browserRoot = actionCallTo(parentConnection).parameter(child).asBrowserRoot()
browserRoot = child.parentConnection
}

parameter(child, childClass.reference) {
description = schema.childDescriptionInCreateRelation(parentClass, childClass, ignoreMissing = true)
mandatory = true
browserRoot = actionCallTo(parentConnection).parameter(item).asBrowserRoot()
browserRoot = item.parentConnection
}
}
}
Expand Down
Expand Up @@ -3,6 +3,7 @@
*/

package net.juniper.contrail.vro.workflows.dsl
import net.juniper.contrail.vro.config.parentConnection as parentConnectionAction

abstract class InventoryBrowserRoot {
abstract val ognl: String?
Expand Down Expand Up @@ -30,4 +31,7 @@ fun ActionCall.asBrowserRoot(): InventoryBrowserRoot =
RootFromAction(this)

fun ActionCallBuilder.asBrowserRoot() =
create().asBrowserRoot()
create().asBrowserRoot()

val String.parentConnection get() =
actionCallTo(parentConnectionAction).parameter(this).asBrowserRoot()
@@ -1,5 +1,2 @@
if (!item) return null;
var id = item.internalId;
var connection = ContrailConnectionManager.connection(id.toString());
connection.internalId = id;
return connection;
return item.connection;
Expand Up @@ -3,6 +3,6 @@ var count = policies.length;
var sequence = new ContrailSequenceType(count, 0);
var attribute = new ContrailVirtualNetworkPolicyType(sequence);

item.addNetworkPolicy(networkPolicy, attribute);
item.addNetworkPolicy(child, attribute);

item.update();
Expand Up @@ -17,6 +17,7 @@ import net.juniper.contrail.vro.workflows.dsl.asBrowserRoot
import net.juniper.contrail.vro.workflows.model.boolean
import net.juniper.contrail.vro.workflows.model.reference
import net.juniper.contrail.vro.schema.Schema
import net.juniper.contrail.vro.workflows.dsl.parentConnection
import net.juniper.contrail.vro.workflows.util.addRelationWorkflowName
import net.juniper.contrail.vro.workflows.util.removeRelationWorkflowName
import net.juniper.contrail.vro.workflows.util.propertyDescription
Expand All @@ -32,10 +33,12 @@ internal fun addFloatingIpToPort(schema: Schema): WorkflowDefinition {
parameter(item, reference<VirtualMachineInterface>()) {
description = schema.parentDescriptionInCreateRelation<VirtualMachineInterface, FloatingIp>()
mandatory = true
browserRoot = child.parentConnection
}
parameter(child, reference<FloatingIp>()) {
description = schema.childDescriptionInCreateRelation<VirtualMachineInterface, FloatingIp>(ignoreMissing = true)
mandatory = true
browserRoot = item.parentConnection
}
parameter("fixedIpAddress", boolean) {
description = propertyDescription<FloatingIp>(schema)
Expand Down
Expand Up @@ -9,16 +9,19 @@ import net.juniper.contrail.api.types.NetworkIpam
import net.juniper.contrail.api.types.NetworkPolicy
import net.juniper.contrail.vro.config.propertyValue
import net.juniper.contrail.vro.config.asForwardRef
import net.juniper.contrail.vro.config.constants.child
import net.juniper.contrail.vro.config.subnetsOfVirtualNetwork
import net.juniper.contrail.vro.config.constants.item
import net.juniper.contrail.vro.config.constants.parent
import net.juniper.contrail.vro.config.parentConnection
import net.juniper.contrail.vro.workflows.dsl.WhenNonNull
import net.juniper.contrail.vro.workflows.dsl.WorkflowDefinition
import net.juniper.contrail.vro.workflows.dsl.actionCallTo
import net.juniper.contrail.vro.workflows.dsl.asBrowserRoot
import net.juniper.contrail.vro.workflows.model.reference
import net.juniper.contrail.vro.workflows.model.string
import net.juniper.contrail.vro.schema.Schema
import net.juniper.contrail.vro.workflows.dsl.parentConnection
import net.juniper.contrail.vro.workflows.util.parentDescriptionInCreateRelation
import net.juniper.contrail.vro.workflows.util.addRelationWorkflowName
import net.juniper.contrail.vro.workflows.util.childDescriptionInCreateRelation
Expand All @@ -36,10 +39,12 @@ internal fun addPolicyToVirtualNetwork(schema: Schema): WorkflowDefinition {
parameter(item, reference<VirtualNetwork>()) {
description = schema.parentDescriptionInCreateRelation<VirtualNetwork, NetworkPolicy>()
mandatory = true
browserRoot = child.parentConnection
}
parameter("networkPolicy", reference<NetworkPolicy>()) {
parameter(child, reference<NetworkPolicy>()) {
description = schema.childDescriptionInCreateRelation<VirtualNetwork, NetworkPolicy>()
mandatory = true
browserRoot = item.parentConnection
}
}
}
Expand Down

0 comments on commit af6db32

Please sign in to comment.