#  Licensed under the Apache License, Version 2.0 (the "License"); you may
#  not use this file except in compliance with the License. You may obtain
#  a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
#  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
#  License for the specific language governing permissions and limitations
#  under the License.

Namespaces:
  =: io.murano.resources
  std: io.murano
  sys: io.murano.system

Name: NovaNetwork

Extends: Network

Methods:
  joinInstance:
    Arguments:
      - instance:
          Contract: $.class(Instance).notNull()
      - securityGroupName:
          Contract: $.string()
      - securityGroups:
          Contract: [$.string()]
      - assignFloatingIp:
          Contract: $.bool().notNull()
      - sharedIps:
          Contract:
            - $.class(std:SharedIp)
    Body:
      - $fipName: null
      - $template: null
      - $instanceFipOutput: null
      - $instanceResources: []
      - $instanceOutputs: []
      - $instanceNetworkOutput: format('{0}-assigned-ips', $instance.name)
      - $template:
          outputs:
            $instanceNetworkOutput:
                description: format('Network IPs assigned to {0} instance', $instance.name)
                value:
                  get_attr: [ $instance.name, networks ]
      - If: $assignFloatingIp
        Then:
          - $instanceFipOutput: $instance.name + '-floatingIPaddress'
          - $fipName: format('fip-nn-{0}', $instance.name)
          - $fipTemplate:
              resources:
                $fipName:
                  type: 'OS::Nova::FloatingIP'
                $fipName + 'Assignment':
                  type: 'OS::Nova::FloatingIPAssociation'
                  properties:
                    floating_ip:
                      get_resource: $fipName
                    server_id:
                      get_resource: $instance.name
              outputs:
                $instanceFipOutput:
                  value:
                    get_attr: [$fipName, ip]
                  description: format('Floating IP of {0}', $instance.name)
          - $template: $template.mergeWith($fipTemplate)
          - $instanceResources: [$fipName, $fipName + 'Assignment']
          - $instanceOutputs: [$instanceFipOutput, $instanceNetworkOutput]
      - Return:
          template: $template
          secGroupName:
            get_resource: $securityGroupName
          instanceFipOutput: $instanceFipOutput
          instanceResources: $instanceResources
          instanceOutputs: $instanceOutputs


  generateSecurityGroupManager:
    Body:
      - Return: new(sys:AwsSecurityGroupManager, $this)


  describe:
    Body:
      - Return:
          provider: NovaNetwork

  getInstanceIpList:
    Arguments:
      - instance:
          Contract: $.class(Instance).notNull()
    Body:
      - Return: $instance.getRegion().stack.output().get(
                    format('{0}-assigned-ips', $instance.name)
                  ).values().flatten().distinct()
