|
|
|
@ -323,8 +323,13 @@ network_offering:
|
|
|
|
|
sample: DefaultIsolatedNetworkOfferingWithSourceNatService
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
# import cloudstack common
|
|
|
|
|
from ansible.module_utils.cloudstack import *
|
|
|
|
|
from ansible.module_utils.basic import AnsibleModule
|
|
|
|
|
from ansible.module_utils.cloudstack import (
|
|
|
|
|
AnsibleCloudStack,
|
|
|
|
|
CloudStackException,
|
|
|
|
|
cs_argument_spec,
|
|
|
|
|
cs_required_together,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class AnsibleCloudStackNetwork(AnsibleCloudStack):
|
|
|
|
@ -332,68 +337,65 @@ class AnsibleCloudStackNetwork(AnsibleCloudStack):
|
|
|
|
|
def __init__(self, module):
|
|
|
|
|
super(AnsibleCloudStackNetwork, self).__init__(module)
|
|
|
|
|
self.returns = {
|
|
|
|
|
'networkdomain': 'network domain',
|
|
|
|
|
'networkofferingname': 'network_offering',
|
|
|
|
|
'ispersistent': 'is_persistent',
|
|
|
|
|
'acltype': 'acl_type',
|
|
|
|
|
'type': 'type',
|
|
|
|
|
'traffictype': 'traffic_type',
|
|
|
|
|
'ip6gateway': 'gateway_ipv6',
|
|
|
|
|
'ip6cidr': 'cidr_ipv6',
|
|
|
|
|
'gateway': 'gateway',
|
|
|
|
|
'cidr': 'cidr',
|
|
|
|
|
'netmask': 'netmask',
|
|
|
|
|
'broadcastdomaintype': 'broadcast_domain_type',
|
|
|
|
|
'dns1': 'dns1',
|
|
|
|
|
'dns2': 'dns2',
|
|
|
|
|
'networkdomain': 'network domain',
|
|
|
|
|
'networkofferingname': 'network_offering',
|
|
|
|
|
'ispersistent': 'is_persistent',
|
|
|
|
|
'acltype': 'acl_type',
|
|
|
|
|
'type': 'type',
|
|
|
|
|
'traffictype': 'traffic_type',
|
|
|
|
|
'ip6gateway': 'gateway_ipv6',
|
|
|
|
|
'ip6cidr': 'cidr_ipv6',
|
|
|
|
|
'gateway': 'gateway',
|
|
|
|
|
'cidr': 'cidr',
|
|
|
|
|
'netmask': 'netmask',
|
|
|
|
|
'broadcastdomaintype': 'broadcast_domain_type',
|
|
|
|
|
'dns1': 'dns1',
|
|
|
|
|
'dns2': 'dns2',
|
|
|
|
|
}
|
|
|
|
|
self.network = None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_network_offering(self, key=None):
|
|
|
|
|
network_offering = self.module.params.get('network_offering')
|
|
|
|
|
if not network_offering:
|
|
|
|
|
self.module.fail_json(msg="missing required arguments: network_offering")
|
|
|
|
|
|
|
|
|
|
args = {}
|
|
|
|
|
args['zoneid'] = self.get_zone(key='id')
|
|
|
|
|
args = {
|
|
|
|
|
'zoneid': self.get_zone(key='id')
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
network_offerings = self.cs.listNetworkOfferings(**args)
|
|
|
|
|
if network_offerings:
|
|
|
|
|
for no in network_offerings['networkoffering']:
|
|
|
|
|
if network_offering in [ no['name'], no['displaytext'], no['id'] ]:
|
|
|
|
|
if network_offering in [no['name'], no['displaytext'], no['id']]:
|
|
|
|
|
return self._get_by_key(key, no)
|
|
|
|
|
self.module.fail_json(msg="Network offering '%s' not found" % network_offering)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _get_args(self):
|
|
|
|
|
args = {}
|
|
|
|
|
args['name'] = self.module.params.get('name')
|
|
|
|
|
args['displaytext'] = self.get_or_fallback('display_text', 'name')
|
|
|
|
|
args['networkdomain'] = self.module.params.get('network_domain')
|
|
|
|
|
args['networkofferingid'] = self.get_network_offering(key='id')
|
|
|
|
|
args = {
|
|
|
|
|
'name': self.module.params.get('name'),
|
|
|
|
|
'displaytext': self.get_or_fallback('display_text', 'name'),
|
|
|
|
|
'networkdomain': self.module.params.get('network_domain'),
|
|
|
|
|
'networkofferingid': self.get_network_offering(key='id')
|
|
|
|
|
}
|
|
|
|
|
return args
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_network(self):
|
|
|
|
|
if not self.network:
|
|
|
|
|
network = self.module.params.get('name')
|
|
|
|
|
|
|
|
|
|
args = {}
|
|
|
|
|
args['zoneid'] = self.get_zone(key='id')
|
|
|
|
|
args['projectid'] = self.get_project(key='id')
|
|
|
|
|
args['account'] = self.get_account(key='name')
|
|
|
|
|
args['domainid'] = self.get_domain(key='id')
|
|
|
|
|
|
|
|
|
|
args = {
|
|
|
|
|
'zoneid': self.get_zone(key='id'),
|
|
|
|
|
'projectid': self.get_project(key='id'),
|
|
|
|
|
'account': self.get_account(key='name'),
|
|
|
|
|
'domainid': self.get_domain(key='id')
|
|
|
|
|
}
|
|
|
|
|
networks = self.cs.listNetworks(**args)
|
|
|
|
|
if networks:
|
|
|
|
|
for n in networks['network']:
|
|
|
|
|
if network in [ n['name'], n['displaytext'], n['id']]:
|
|
|
|
|
if network in [n['name'], n['displaytext'], n['id']]:
|
|
|
|
|
self.network = n
|
|
|
|
|
break
|
|
|
|
|
return self.network
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def present_network(self):
|
|
|
|
|
network = self.get_network()
|
|
|
|
|
if not network:
|
|
|
|
@ -402,10 +404,9 @@ class AnsibleCloudStackNetwork(AnsibleCloudStack):
|
|
|
|
|
network = self.update_network(network)
|
|
|
|
|
return network
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def update_network(self, network):
|
|
|
|
|
args = self._get_args()
|
|
|
|
|
args['id'] = network['id']
|
|
|
|
|
args = self._get_args()
|
|
|
|
|
args['id'] = network['id']
|
|
|
|
|
|
|
|
|
|
if self.has_changed(args, network):
|
|
|
|
|
self.result['changed'] = True
|
|
|
|
@ -420,28 +421,29 @@ class AnsibleCloudStackNetwork(AnsibleCloudStack):
|
|
|
|
|
network = self.poll_job(network, 'network')
|
|
|
|
|
return network
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def create_network(self, network):
|
|
|
|
|
self.result['changed'] = True
|
|
|
|
|
|
|
|
|
|
args = self._get_args()
|
|
|
|
|
args['acltype'] = self.module.params.get('acl_type')
|
|
|
|
|
args['zoneid'] = self.get_zone(key='id')
|
|
|
|
|
args['projectid'] = self.get_project(key='id')
|
|
|
|
|
args['account'] = self.get_account(key='name')
|
|
|
|
|
args['domainid'] = self.get_domain(key='id')
|
|
|
|
|
args['startip'] = self.module.params.get('start_ip')
|
|
|
|
|
args['endip'] = self.get_or_fallback('end_ip', 'start_ip')
|
|
|
|
|
args['netmask'] = self.module.params.get('netmask')
|
|
|
|
|
args['gateway'] = self.module.params.get('gateway')
|
|
|
|
|
args['startipv6'] = self.module.params.get('start_ipv6')
|
|
|
|
|
args['endipv6'] = self.get_or_fallback('end_ipv6', 'start_ipv6')
|
|
|
|
|
args['ip6cidr'] = self.module.params.get('cidr_ipv6')
|
|
|
|
|
args['ip6gateway'] = self.module.params.get('gateway_ipv6')
|
|
|
|
|
args['vlan'] = self.module.params.get('vlan')
|
|
|
|
|
args['isolatedpvlan'] = self.module.params.get('isolated_pvlan')
|
|
|
|
|
args['subdomainaccess'] = self.module.params.get('subdomain_access')
|
|
|
|
|
args['vpcid'] = self.get_vpc(key='id')
|
|
|
|
|
args = self._get_args()
|
|
|
|
|
args.update({
|
|
|
|
|
'acltype': self.module.params.get('acl_type'),
|
|
|
|
|
'zoneid': self.get_zone(key='id'),
|
|
|
|
|
'projectid': self.get_project(key='id'),
|
|
|
|
|
'account': self.get_account(key='name'),
|
|
|
|
|
'domainid': self.get_domain(key='id'),
|
|
|
|
|
'startip': self.module.params.get('start_ip'),
|
|
|
|
|
'endip': self.get_or_fallback('end_ip', 'start_ip'),
|
|
|
|
|
'netmask': self.module.params.get('netmask'),
|
|
|
|
|
'gateway': self.module.params.get('gateway'),
|
|
|
|
|
'startipv6': self.module.params.get('start_ipv6'),
|
|
|
|
|
'endipv6': self.get_or_fallback('end_ipv6', 'start_ipv6'),
|
|
|
|
|
'ip6cidr': self.module.params.get('cidr_ipv6'),
|
|
|
|
|
'ip6gateway': self.module.params.get('gateway_ipv6'),
|
|
|
|
|
'vlan': self.module.params.get('vlan'),
|
|
|
|
|
'isolatedpvlan': self.module.params.get('isolated_pvlan'),
|
|
|
|
|
'subdomainaccess': self.module.params.get('subdomain_access'),
|
|
|
|
|
'vpcid': self.get_vpc(key='id')
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
if not self.module.check_mode:
|
|
|
|
|
res = self.cs.createNetwork(**args)
|
|
|
|
@ -452,7 +454,6 @@ class AnsibleCloudStackNetwork(AnsibleCloudStack):
|
|
|
|
|
network = res['network']
|
|
|
|
|
return network
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def restart_network(self):
|
|
|
|
|
network = self.get_network()
|
|
|
|
|
|
|
|
|
@ -460,12 +461,13 @@ class AnsibleCloudStackNetwork(AnsibleCloudStack):
|
|
|
|
|
self.module.fail_json(msg="No network named '%s' found." % self.module.params('name'))
|
|
|
|
|
|
|
|
|
|
# Restarting only available for these states
|
|
|
|
|
if network['state'].lower() in [ 'implemented', 'setup' ]:
|
|
|
|
|
if network['state'].lower() in ['implemented', 'setup']:
|
|
|
|
|
self.result['changed'] = True
|
|
|
|
|
|
|
|
|
|
args = {}
|
|
|
|
|
args['id'] = network['id']
|
|
|
|
|
args['cleanup'] = self.module.params.get('clean_up')
|
|
|
|
|
args = {
|
|
|
|
|
'id': network['id'],
|
|
|
|
|
'cleanup': self.module.params.get('clean_up')
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if not self.module.check_mode:
|
|
|
|
|
network = self.cs.restartNetwork(**args)
|
|
|
|
@ -478,14 +480,14 @@ class AnsibleCloudStackNetwork(AnsibleCloudStack):
|
|
|
|
|
network = self.poll_job(network, 'network')
|
|
|
|
|
return network
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def absent_network(self):
|
|
|
|
|
network = self.get_network()
|
|
|
|
|
if network:
|
|
|
|
|
self.result['changed'] = True
|
|
|
|
|
|
|
|
|
|
args = {}
|
|
|
|
|
args['id'] = network['id']
|
|
|
|
|
args = {
|
|
|
|
|
'id': network['id']
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if not self.module.check_mode:
|
|
|
|
|
res = self.cs.deleteNetwork(**args)
|
|
|
|
@ -499,38 +501,36 @@ class AnsibleCloudStackNetwork(AnsibleCloudStack):
|
|
|
|
|
return network
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def main():
|
|
|
|
|
argument_spec = cs_argument_spec()
|
|
|
|
|
argument_spec.update(dict(
|
|
|
|
|
name = dict(required=True),
|
|
|
|
|
display_text = dict(default=None),
|
|
|
|
|
network_offering = dict(default=None),
|
|
|
|
|
zone = dict(default=None),
|
|
|
|
|
start_ip = dict(default=None),
|
|
|
|
|
end_ip = dict(default=None),
|
|
|
|
|
gateway = dict(default=None),
|
|
|
|
|
netmask = dict(default=None),
|
|
|
|
|
start_ipv6 = dict(default=None),
|
|
|
|
|
end_ipv6 = dict(default=None),
|
|
|
|
|
cidr_ipv6 = dict(default=None),
|
|
|
|
|
gateway_ipv6 = dict(default=None),
|
|
|
|
|
vlan = dict(default=None),
|
|
|
|
|
vpc = dict(default=None),
|
|
|
|
|
isolated_pvlan = dict(default=None),
|
|
|
|
|
clean_up = dict(type='bool', default=False),
|
|
|
|
|
network_domain = dict(default=None),
|
|
|
|
|
state = dict(choices=['present', 'absent', 'restarted' ], default='present'),
|
|
|
|
|
acl_type = dict(choices=['account', 'domain'], default='account'),
|
|
|
|
|
project = dict(default=None),
|
|
|
|
|
domain = dict(default=None),
|
|
|
|
|
account = dict(default=None),
|
|
|
|
|
poll_async = dict(type='bool', default=True),
|
|
|
|
|
name=dict(required=True),
|
|
|
|
|
display_text=dict(),
|
|
|
|
|
network_offering=dict(),
|
|
|
|
|
zone=dict(),
|
|
|
|
|
start_ip=dict(),
|
|
|
|
|
end_ip=dict(),
|
|
|
|
|
gateway=dict(),
|
|
|
|
|
netmask=dict(),
|
|
|
|
|
start_ipv6=dict(),
|
|
|
|
|
end_ipv6=dict(),
|
|
|
|
|
cidr_ipv6=dict(),
|
|
|
|
|
gateway_ipv6=dict(),
|
|
|
|
|
vlan=dict(),
|
|
|
|
|
vpc=dict(),
|
|
|
|
|
isolated_pvlan=dict(),
|
|
|
|
|
clean_up=dict(type='bool', default=False),
|
|
|
|
|
network_domain=dict(),
|
|
|
|
|
state=dict(choices=['present', 'absent', 'restarted'], default='present'),
|
|
|
|
|
acl_type=dict(choices=['account', 'domain']),
|
|
|
|
|
project=dict(),
|
|
|
|
|
domain=dict(),
|
|
|
|
|
account=dict(),
|
|
|
|
|
poll_async=dict(type='bool', default=True),
|
|
|
|
|
))
|
|
|
|
|
required_together = cs_required_together()
|
|
|
|
|
required_together.extend([
|
|
|
|
|
['start_ip', 'netmask', 'gateway'],
|
|
|
|
|
['start_ipv6', 'cidr_ipv6', 'gateway_ipv6'],
|
|
|
|
|
['netmask', 'gateway'],
|
|
|
|
|
])
|
|
|
|
|
|
|
|
|
|
module = AnsibleModule(
|
|
|
|
@ -559,7 +559,6 @@ def main():
|
|
|
|
|
|
|
|
|
|
module.exit_json(**result)
|
|
|
|
|
|
|
|
|
|
# import module snippets
|
|
|
|
|
from ansible.module_utils.basic import *
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
|
main()
|
|
|
|
|