|
|
@ -22,9 +22,9 @@ except ImportError:
|
|
|
|
|
|
|
|
|
|
|
|
SERVICE_MAP = {'vca': 'ondemand', 'vchs': 'subscription', 'vcd': 'vcd'}
|
|
|
|
SERVICE_MAP = {'vca': 'ondemand', 'vchs': 'subscription', 'vcd': 'vcd'}
|
|
|
|
LOGIN_HOST = {'vca': 'vca.vmware.com', 'vchs': 'vchs.vmware.com'}
|
|
|
|
LOGIN_HOST = {'vca': 'vca.vmware.com', 'vchs': 'vchs.vmware.com'}
|
|
|
|
VCA_REQ_ARGS = ['instance_id', 'vdc_name']
|
|
|
|
|
|
|
|
VCHS_REQ_ARGS = ['service_id']
|
|
|
|
|
|
|
|
DEFAULT_SERVICE_TYPE = 'vca'
|
|
|
|
DEFAULT_SERVICE_TYPE = 'vca'
|
|
|
|
|
|
|
|
DEFAULT_VERSION = '5.7'
|
|
|
|
|
|
|
|
|
|
|
|
class VcaError(Exception):
|
|
|
|
class VcaError(Exception):
|
|
|
|
|
|
|
|
|
|
|
@ -32,6 +32,153 @@ class VcaError(Exception):
|
|
|
|
self.kwargs = kwargs
|
|
|
|
self.kwargs = kwargs
|
|
|
|
super(VcaError, self).__init__(msg)
|
|
|
|
super(VcaError, self).__init__(msg)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def vca_argument_spec():
|
|
|
|
|
|
|
|
return dict(
|
|
|
|
|
|
|
|
username=dict(),
|
|
|
|
|
|
|
|
password=dict(),
|
|
|
|
|
|
|
|
org=dict(),
|
|
|
|
|
|
|
|
service_id=dict(),
|
|
|
|
|
|
|
|
instance_id=dict(),
|
|
|
|
|
|
|
|
host=dict(),
|
|
|
|
|
|
|
|
api_version=dict(default=DEFAULT_VERSION),
|
|
|
|
|
|
|
|
service_type=dict(default=DEFAULT_SERVICE_TYPE, choices=SERVICE_MAP.keys()),
|
|
|
|
|
|
|
|
vdc_name=dict(),
|
|
|
|
|
|
|
|
gateway_name=dict(default='gateway')
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class VcaAnsibleModule(AnsibleModule):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
|
|
|
|
argument_spec = vca_argument_spec()
|
|
|
|
|
|
|
|
argument_spec.update(kwargs.get('argument_spec', dict()))
|
|
|
|
|
|
|
|
kwargs['argument_spec'] = argument_spec
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
super(VcaAnsibleModule, self).__init__(*args, **kwargs)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if not HAS_PYVCLOUD:
|
|
|
|
|
|
|
|
self.fail("python module pyvcloud is required for this module")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
self._vca = self.create_instance()
|
|
|
|
|
|
|
|
self.login()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
self._gateway = None
|
|
|
|
|
|
|
|
self._vdc = None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
|
|
|
|
def vca(self):
|
|
|
|
|
|
|
|
return self._vca
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
|
|
|
|
def gateway(self):
|
|
|
|
|
|
|
|
if self._gateway is not None:
|
|
|
|
|
|
|
|
return self._gateway
|
|
|
|
|
|
|
|
vdc_name = self.params['vdc_name']
|
|
|
|
|
|
|
|
gateway_name = self.params['gateway_name']
|
|
|
|
|
|
|
|
_gateway = self.vca.get_gateway(vdc_name, gateway_name)
|
|
|
|
|
|
|
|
if not _gateway:
|
|
|
|
|
|
|
|
raise VcaError('vca instance has no gateway named %s' % name)
|
|
|
|
|
|
|
|
self._gateway = _gateway
|
|
|
|
|
|
|
|
return _gateway
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
|
|
|
|
def vdc(self):
|
|
|
|
|
|
|
|
if self._vdc is not None:
|
|
|
|
|
|
|
|
return self._vdc
|
|
|
|
|
|
|
|
_vdc = self.vca.get_vdc(self.params['vdc_name'])
|
|
|
|
|
|
|
|
if not _vdc:
|
|
|
|
|
|
|
|
raise VcaError('vca instance has no vdc named %s' % name)
|
|
|
|
|
|
|
|
self._vdc = _vdc
|
|
|
|
|
|
|
|
return _vdc
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def create_instance(self):
|
|
|
|
|
|
|
|
service_type = self.params.get('service_type', DEFAULT_SERVICE_TYPE)
|
|
|
|
|
|
|
|
host = self.params.get('host', LOGIN_HOST.get('service_type'))
|
|
|
|
|
|
|
|
username = self.params['username']
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
version = self.params.get('api_version')
|
|
|
|
|
|
|
|
if service_type == 'vchs':
|
|
|
|
|
|
|
|
version = '5.6'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
verify = self.params.get('verify_certs')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return VCA(host=host, username=username,
|
|
|
|
|
|
|
|
service_type=SERVICE_MAP[service_type],
|
|
|
|
|
|
|
|
version=version, verify=verify)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def login(self):
|
|
|
|
|
|
|
|
service_type = self.params['service_type']
|
|
|
|
|
|
|
|
password = self.params['password']
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if not self.vca.login(password=password):
|
|
|
|
|
|
|
|
self.fail('Login to VCA failed', response=self.vca.response.content)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
|
|
|
method_name = 'login_%s' % service_type
|
|
|
|
|
|
|
|
meth = getattr(self, method_name)
|
|
|
|
|
|
|
|
meth()
|
|
|
|
|
|
|
|
except AttributeError:
|
|
|
|
|
|
|
|
self.fail('no login method exists for service_type %s' % service_type)
|
|
|
|
|
|
|
|
except VcaError, e:
|
|
|
|
|
|
|
|
self.fail(e.message, response=self.vca.response.content, **e.kwargs)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def login_vca(self):
|
|
|
|
|
|
|
|
instance_id = self.params['instance_id']
|
|
|
|
|
|
|
|
if not instance_id:
|
|
|
|
|
|
|
|
raise VcaError('missing required instance_id for service_type vca')
|
|
|
|
|
|
|
|
self.vca.login_to_instance_sso(instance=instance_id)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def login_vchs(self):
|
|
|
|
|
|
|
|
service_id = self.params['service_id']
|
|
|
|
|
|
|
|
if not service_id:
|
|
|
|
|
|
|
|
raise VcaError('missing required service_id for service_type vchs')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
org = self.params['org']
|
|
|
|
|
|
|
|
if not org:
|
|
|
|
|
|
|
|
raise VcaError('missing required or for service_type vchs')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
self.vca.login_to_org(service_id, org)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def login_vcd(self):
|
|
|
|
|
|
|
|
org = self.params['org']
|
|
|
|
|
|
|
|
if not org:
|
|
|
|
|
|
|
|
raise VcaError('missing required or for service_type vchs')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if not self.vca.token:
|
|
|
|
|
|
|
|
raise VcaError('unable to get token for service_type vcd')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if not self.vca.vcloud_session.org_url:
|
|
|
|
|
|
|
|
raise VcaError('unable to get org_url for service_type vcd')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
self.vca.login(token=self.vca.token, org=org,
|
|
|
|
|
|
|
|
org_url=self.vca.vcloud_session.org_url)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def save_services_config(self, blocking=True):
|
|
|
|
|
|
|
|
task = self.gateway.save_services_configuration()
|
|
|
|
|
|
|
|
if not task:
|
|
|
|
|
|
|
|
self.fail(msg='unable to save gateway services configuration')
|
|
|
|
|
|
|
|
if blocking:
|
|
|
|
|
|
|
|
self.vca.block_until_completed(task)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def fail(self, msg, **kwargs):
|
|
|
|
|
|
|
|
self.fail_json(msg=msg, **kwargs)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def exit(self, **kwargs):
|
|
|
|
|
|
|
|
self.exit_json(**kwargs)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# -------------------------------------------------------------
|
|
|
|
|
|
|
|
# 9/18/2015 @privateip
|
|
|
|
|
|
|
|
# All of the functions below here were migrated from the original
|
|
|
|
|
|
|
|
# vca_* modules. All functions below should be considered deprecated
|
|
|
|
|
|
|
|
# and will be removed once all of the vca_* modules have been updated
|
|
|
|
|
|
|
|
# to use the new instance module above
|
|
|
|
|
|
|
|
# -------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
VCA_REQ_ARGS = ['instance_id', 'vdc_name']
|
|
|
|
|
|
|
|
VCHS_REQ_ARGS = ['service_id']
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _validate_module(module):
|
|
|
|
def _validate_module(module):
|
|
|
|
if not HAS_PYVCLOUD:
|
|
|
|
if not HAS_PYVCLOUD:
|
|
|
|
module.fail_json("python module pyvcloud is needed for this module")
|
|
|
|
module.fail_json("python module pyvcloud is needed for this module")
|
|
|
@ -63,19 +210,6 @@ def serialize_instances(instance_list):
|
|
|
|
instances.append(dict(apiUrl=i['apiUrl'], instance_id=i['id']))
|
|
|
|
instances.append(dict(apiUrl=i['apiUrl'], instance_id=i['id']))
|
|
|
|
return instances
|
|
|
|
return instances
|
|
|
|
|
|
|
|
|
|
|
|
def vca_argument_spec():
|
|
|
|
|
|
|
|
return dict(
|
|
|
|
|
|
|
|
username = dict(default=None),
|
|
|
|
|
|
|
|
password = dict(default=None),
|
|
|
|
|
|
|
|
org = dict(default=None),
|
|
|
|
|
|
|
|
service_id = dict(default=None),
|
|
|
|
|
|
|
|
instance_id = dict(default=None),
|
|
|
|
|
|
|
|
host = dict(default=None),
|
|
|
|
|
|
|
|
api_version = dict(default='5.7'),
|
|
|
|
|
|
|
|
service_type = dict(default='vca', choices=['vchs', 'vca', 'vcd']),
|
|
|
|
|
|
|
|
vdc_name = dict(default=None),
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _vca_login(vca, password, instance):
|
|
|
|
def _vca_login(vca, password, instance):
|
|
|
|
if not vca.login(password=password):
|
|
|
|
if not vca.login(password=password):
|
|
|
|
raise VcaError("Login Failed: Please check username or password",
|
|
|
|
raise VcaError("Login Failed: Please check username or password",
|
|
|
@ -163,3 +297,7 @@ def vca_login(module):
|
|
|
|
|
|
|
|
|
|
|
|
return vca
|
|
|
|
return vca
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|