deb-murano/meta/io.murano/Classes/resources/Instance.yaml
Stan Lagun 425766a7f8 Migration to yaql 1.0
* Code migrated to yaql 1.0.0
* New MuranoPL object initialization
* Lots of refactoring

See referenced specs for more information

Implements: blueprint migrate-to-yaql-vnext
Implements: blueprint object-construction
Depends-on: I7f314634ab5f08a521e51082d5c84dffca4b0b5c
Closes-Bug: #1454264

Change-Id: I740a4f83c76d8b56a1da585a739d770ef823a524
2015-08-25 16:08:08 +03:00

244 lines
7.9 KiB
YAML

Namespaces:
=: io.murano.resources
std: io.murano
sys: io.murano.system
Name: Instance
Properties:
name:
Contract: $.string().notNull()
flavor:
Contract: $.string().notNull()
image:
Contract: $.string().notNull()
keyname:
Contract: $.string()
Default: null
openstackId:
Contract: $.string()
Usage: Out
availabilityZone:
Contract: $.string().notNull()
Default: nova
agent:
Contract: $.class(sys:Agent)
Usage: Runtime
ipAddresses:
Contract: [$.string()]
Usage: Out
networks:
Contract:
useEnvironmentNetwork: $.bool().notNull()
useFlatNetwork: $.bool().notNull()
customNetworks: [$.class(Network).notNull()]
primaryNetwork: $.class(Network).notOwned()
Default:
useEnvironmentNetwork: true
useFlatNetwork: false
customNetworks: []
primaryNetwork: null
assignFloatingIp:
Contract: $.bool().notNull()
Default: false
floatingIpAddress:
Contract: $.string()
Usage: Out
securityGroupName:
Contract: $.string()
Default: null
sharedIps:
Contract:
- $.class(std:SharedIp)
Usage: InOut # as it is set in setSharedIps
Methods:
initialize:
Body:
- $.environment: $.find(std:Environment).require()
- $.agent: new(sys:Agent, host => $)
- $.resources: new(sys:Resources)
- $.instanceTemplate: {}
- $._floatingIpOutputName: null
# Called after the Instance template pieces are in place. It
# is at this stage alterations to the template should be made
prepareStackTemplate:
Arguments:
instanceTemplate:
Contract: {}
Body:
- Return: $instanceTemplate
setSharedIps:
Arguments:
ips:
Contract:
- $.class(std:SharedIp)
Body:
$.sharedIps: $ips
deploy:
Body:
- $securityGroupName: coalesce(
$.securityGroupName,
$.environment.securityGroupManager.defaultGroupName
)
- $.createDefaultInstanceSecurityGroupRules($securityGroupName)
- $.detectPrimaryNetwork()
- $.ensureSharedIpsDeployed()
- $.ensureNetworksDeployed()
- If: $.networks.useEnvironmentNetwork and $.environment.defaultNetworks.environment!=null
Then:
$.joinNet($.environment.defaultNetworks.environment, $securityGroupName)
- If: $.networks.useFlatNetwork and $.environment.defaultNetworks.flat!=null
Then:
$.joinNet($.environment.defaultNetworks.flat, $securityGroupName)
- $.networks.customNetworks.select($this.joinNet($, $securityGroupName))
- $preparedUserData: $.prepareUserData()
- $userData: $preparedUserData.data
- $userDataFormat: $preparedUserData.format
# Create MQ queue to communicate with the VM
- $.agent.prepare()
- $template:
resources:
$.name:
type: 'OS::Nova::Server'
properties:
flavor: $.flavor
image: $.image
availability_zone: $.availabilityZone
user_data: $userData
user_data_format: $userDataFormat
key_name: $.keyname
outputs:
format('{0}-assigned-ips', $.name):
description: format('Network IPs assigned to {0} instance', $.name)
value:
get_attr: [ $.name, networks ]
format('{0}-id', $.name):
description: format('ID of {0} instance', $.name)
value:
get_resource: $.name
- $.instanceTemplate: $.instanceTemplate.mergeWith($template)
# Any additional template preparation
- $.instanceTemplate: $.prepareStackTemplate($.instanceTemplate)
- $.environment.stack.updateTemplate($.instanceTemplate)
- $.environment.stack.push()
- $outputs: $.environment.stack.output()
- $.ipAddresses: $outputs.get(format('{0}-assigned-ips', $this.name)).values().flatten().distinct()
- $.openstackId: $outputs.get(format('{0}-id', $this.name))
- If: $._floatingIpOutputName != null
Then:
- $.floatingIpAddress: $outputs.get($._floatingIpOutputName)
- If: $.floatingIpAddress != null
Then: $.setAttr(fipAssigned, true)
- $.environment.instanceNotifier.trackCloudInstance($this)
detectPrimaryNetwork:
Body:
- $._primaryNetwork: null
- If: $.networks.primaryNetwork != null
Then:
- $._primaryNetwork: $.networks.primaryNetwork
Else:
- If: $.networks.useEnvironmentNetwork and $.environment.defaultNetworks.environment!=null
Then:
- $._primaryNetwork: $.environment.defaultNetworks.environment
Else:
- If: $.networks.useFlatNetwork and $.environment.defaultNetworks.flat!=null
Then:
- $._primaryNetwork: $.environment.defaultNetworks.flat
Else:
- If: $.networks.customNetworks!= null
Then:
- $._primaryNetwork: $.networks.customNetworks.firstOrDefault()
ensureNetworksDeployed:
Body:
- If: $.networks.useEnvironmentNetwork and $.environment.defaultNetworks.environment!=null
Then:
- $.environment.defaultNetworks.environment.deploy()
- If: $.networks.useFlatNetwork and $.environment.defaultNetworks.flat!=null
Then:
- $.environment.defaultNetworks.flat.deploy()
- $.networks.customNetworks.pselect($.deploy())
ensureSharedIpsDeployed:
Body:
- $.sharedIps.pselect($.deploy())
joinNet:
Arguments:
- net:
Contract: $.class(Network).notNull()
- securityGroupName:
Contract: $.string()
Body:
- $primary: $net = $._primaryNetwork
- $assignFip: $primary and $.assignFloatingIp and not $.getAttr(fipAssigned, false)
- $sharedIps: []
- If: $primary
Then:
$sharedIps: $.sharedIps
- $joinResult: $net.joinInstance(
instance => $this,
securityGroupName => $securityGroupName,
assignFloatingIp => $assignFip,
sharedIps => $sharedIps
)
- If: $joinResult.template != null
Then:
- $.instanceTemplate: $.instanceTemplate.mergeWith($joinResult.template)
- If: $joinResult.portRef != null
Then:
- $template:
resources:
$.name:
properties:
networks:
- port:
$joinResult.portRef
- $.instanceTemplate: $.instanceTemplate.mergeWith($template)
- If: $joinResult.secGroupName != null
Then:
- $template:
resources:
$.name:
properties:
security_groups:
- $joinResult.secGroupName
- $.instanceTemplate: $.instanceTemplate.mergeWith($template)
- $._floatingIpOutputName: coalesce($._floatingIpOutputName, $joinResult.instanceFipOutput)
destroy:
# FIXME(smelikyan): All allocated resources should be cleaned-up on destroy
# Now no clean-up happens here cause we don't track all native resources
# that are allocated at the moment in descendants of Instance or other
# classes that may allocate resource dependent on OS::Nova:Server used
# as underlying implementation for Instance. This can cause
# resource leak when environment is updated. Resources are cleaned-up only
# when whole Environment is deleted (alongside with Heat stack deletion).
# https://bugs.launchpad.net/murano/+bug/1359998
Body:
- $.environment.instanceNotifier.untrackCloudInstance($this)
createDefaultInstanceSecurityGroupRules:
Arguments:
- groupName:
Contract: $.string().notNull()
prepareUserData:
Body:
Return:
data: null
# Valid values are HEAT_CFNTOOLS, RAW and SOFTWARE_CONFIG
format: HEAT_CFNTOOLS