#  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: NeutronNetworkBase

Extends: Network

Methods:
  joinInstanceToNetwork:
    Arguments:
      - instance:
          Contract: $.class(Instance).notNull()
      - securityGroupName:
          Contract: $.string()
      - sharedIps:
          Contract:
            - $.class(std:SharedIp)
      - netRef:
            Contract: $
      - subnetRef:
            Contract: $
      - floatingIpResourceName:
          Contract: $.string()
      - floatingIpNetRef:
          Contract: $
    Body:
      - $portName: format('port-{0}-{1}', $.id(), $instance.name)
      - $patchTemplate:
          resources:
            $portName:
              type: 'OS::Neutron::Port'
              properties:
                network: $netRef
                fixed_ips:
                  - subnet: $subnetRef
                replacement_policy: AUTO

      - If: bool($securityGroupName)
        Then:
          - $template:
              resources:
                $portName:
                  properties:
                    security_groups:
                      - get_resource: $securityGroupName
          - $patchTemplate: $patchTemplate.mergeWith($template)

      - $instanceResources: [$portName]
      - $instanceOutputs: []

      - For: sip
        In: $sharedIps
        Do:
          - $template:
              resources:
                $portName:
                  properties:
                    allowed_address_pairs:
                      - ip_address: $sip.getSharedIpRef()
          - $patchTemplate: $patchTemplate.mergeWith($template)

      - $instanceFipOutput: null
      - If: $floatingIpResourceName != null and $floatingIpNetRef != null
        Then:
          - $instanceFipOutput: $instance.name + '-floatingIPaddress'
          - $template:
              resources:
                $floatingIpResourceName:
                  type: 'OS::Neutron::FloatingIP'
                  properties:
                    floating_network: $floatingIpNetRef
                    port_id:
                      get_resource: $portName
              outputs:
                $instanceFipOutput:
                  value:
                    get_attr: [$floatingIpResourceName, floating_ip_address]
                  description: format('Floating IP of {0}', $instance.name)
          - $instanceResources: $instanceResources.append($floatingIpResourceName)
          - $instanceOutputs: $instanceOutputs.append($instanceFipOutput)
          - $patchTemplate: $patchTemplate.mergeWith($template)
      - Return:
          template: $patchTemplate
          portRef:
            get_resource: $portName
          instanceFipOutput: $instanceFipOutput
          instanceResources: $instanceResources
          instanceOutputs: $instanceOutputs


  generateSecurityGroupManager:
    Arguments:
      - environment:
          Contract: $.class(std:Environment).notNull()
    Body:
      - Return: new(sys:NeutronSecurityGroupManager, environment => $environment)
