Пример #1
0
def initialize_cloud(cloud_name):
    """Initialize cloud object.

       Cloud configs are read with os-client-config.

    :param cloud_name: the cloud name
    """

    if not cloud_name:
        return shade.openstack_cloud()
    else:
        return shade.openstack_cloud(cloud=cloud_name)
Пример #2
0
 def setUp(self):
     super(TestImage, self).setUp()
     self.cloud = shade.openstack_cloud(validate=False)
     self.image_id = str(uuid.uuid4())
     self.fake_search_return = [{
         u'image_state': u'available',
         u'container_format': u'bare',
         u'min_ram': 0,
         u'ramdisk_id': None,
         u'updated_at': u'2016-02-10T05:05:02Z',
         u'file': '/v2/images/' + self.image_id + '/file',
         u'size': 3402170368,
         u'image_type': u'snapshot',
         u'disk_format': u'qcow2',
         u'id': self.image_id,
         u'schema': u'/v2/schemas/image',
         u'status': u'active',
         u'tags': [],
         u'visibility': u'private',
         u'locations': [{
             u'url': u'http://127.0.0.1/images/' + self.image_id,
             u'metadata': {}}],
         u'min_disk': 40,
         u'virtual_size': None,
         u'name': u'fake_image',
         u'checksum': u'ee36e35a297980dee1b514de9803ec6d',
         u'created_at': u'2016-02-10T05:03:11Z',
         u'protected': False}]
     self.output = six.BytesIO()
     self.output.write(uuid.uuid4().bytes)
     self.output.seek(0)
Пример #3
0
def _get_cloud(cloud, region, project=None):
    if project:
        domain_id = project.domain_id
        domain_name = project.domain_name
        project_id = project.id
        project_name = project.name
        kwargs = dict(
            project_domain_id=domain_id,
            project_domain_name=domain_name,
            project_id=project_id,
            project_name=project_name,
        )
    else:
        domain_id = domain_name = project_id = project_name = None
        kwargs = {}

    key = _make_cloud_key(
        cloud, region,
        domain_id or domain_name,
        project_id or project_name
    )
    if key not in all_clouds:
        all_clouds[key] = shade.openstack_cloud(
            cloud=cloud, region_name=region,
            debug=True, strict=True, **kwargs)
    return all_clouds[key]
Пример #4
0
def main():
    argument_spec = openstack_full_argument_spec(
        display_name=dict(required=True, aliases=['name']),
        display_description=dict(default=None, aliases=['description']),
        volume=dict(required=True),
        force=dict(required=False, default=False, type='bool'),
        state=dict(default='present', choices=['absent', 'present']),
    )

    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(argument_spec,
                           supports_check_mode=True,
                           **module_kwargs)

    if not HAS_SHADE:
        module.fail_json(msg='shade is required for this module')

    state = module.params['state']

    try:
        cloud = shade.openstack_cloud(**module.params)
        if cloud.volume_exists(module.params['volume']):
            if module.check_mode:
                module.exit_json(changed=_system_state_change(module, cloud))
            if state == 'present':
                _present_volume_snapshot(module, cloud)
            if state == 'absent':
                _absent_volume_snapshot(module, cloud)
        else:
            module.fail_json(
                msg="No volume with name or id '{0}' was found.".format(
                    module.params['volume']))
    except (shade.OpenStackCloudException, shade.OpenStackCloudTimeout) as e:
        module.fail_json(msg=e.message)
def main():
    ''' Main module function '''
    module = AnsibleModule(
        argument_spec=dict(
            trunk_name=dict(default=False, type='str'),
        ),
        supports_check_mode=True,
    )

    if not HAS_SHADE:
        module.fail_json(msg='shade is required for this module')

    try:
        cloud = shade.openstack_cloud()
    # pylint: disable=broad-except
    except Exception:
        module.fail_json(msg='Failed to connect to the cloud')

    try:
        adapter = keystoneauth1.adapter.Adapter(
            session=cloud.keystone_session,
            service_type=cloud.cloud_config.get_service_type('network'),
            interface=cloud.cloud_config.get_interface('network'),
            endpoint_override=cloud.cloud_config.get_endpoint('network'),
            version=cloud.cloud_config.get_api_version('network'))
    # pylint: disable=broad-except
    except Exception:
        module.fail_json(msg='Failed to get an adapter to talk to the Neutron '
                             'API')

    try:
        trunk_response = adapter.get('/trunks')
    # pylint: disable=broad-except
    except Exception:
        module.fail_json(msg='Failed to retrieve Neutron trunk information')

    subports = []
    for trunk in trunk_response.json()['trunks']:
        if trunk['name'] == module.params['trunk_name']:
            trunk_id = trunk['id']
            for subport in trunk['sub_ports']:
                subports.append(subport['port_id'])

    data = _get_data(subports)
    try:
        adapter.put('/trunks/' + trunk_id + '/remove_subports',
                    **data)
    # pylint: disable=broad-except
    except Exception:
        module.fail_json(msg='Failed to detach subports')

    try:
        for port in subports:
            adapter.delete('/ports/' + port)
    # pylint: disable=broad-except
    except Exception:
        module.fail_json(msg='Failed to delete Neutron subports')

    module.exit_json(
        changed=True)
def main():

    argument_spec = openstack_full_argument_spec(
        security_group=dict(required=False),
        filters=dict(required=False, type='dict', default=None),
    )

#    module_kwargs = openstack_module_kwargs()
#    module = AnsibleModule(argument_spec, **module_kwargs)

    module = AnsibleModule(argument_spec)

    if not HAS_SHADE:
        module.fail_json(msg='shade is required for this module')

#    security_group =module.params.pop('security_group') 
#    filters = module.params.pop('filters')

    try:
        cloud = shade.openstack_cloud(**module.params)
        openstack_security_groups = cloud.list_security_groups()

        module.exit_json(changed=False, ansible_facts=dict(
            openstack_security_groups=openstack_security_groups)) 

    except shade.OpenStackCloudException as e:
        module.fail_json(msg=str(e))
Пример #7
0
def main():
    argument_spec = openstack_full_argument_spec(
        size=dict(default=None),
        volume_type=dict(default=None),
        display_name=dict(required=True, aliases=['name']),
        display_description=dict(default=None, aliases=['description']),
        image=dict(default=None),
        snapshot_id=dict(default=None),
        state=dict(default='present', choices=['absent', 'present']),
    )
    module_kwargs = openstack_module_kwargs(
        mutually_exclusive=[
            ['image', 'snapshot_id'],
        ],
    )
    module = AnsibleModule(argument_spec=argument_spec, **module_kwargs)

    if not HAS_SHADE:
        module.fail_json(msg='shade is required for this module')

    state = module.params['state']

    if state == 'present' and not module.params['size']:
        module.fail_json(msg="Size is required when state is 'present'")

    try:
        cloud = shade.openstack_cloud(**module.params)
        if state == 'present':
            _present_volume(module, cloud)
        if state == 'absent':
            _absent_volume(module, cloud)
    except shade.OpenStackCloudException as e:
        module.fail_json(msg=str(e))
Пример #8
0
 def __init__(self, molecule):
     super(OpenstackDriver, self).__init__(molecule)
     self._provider = self._get_provider()
     self._platform = self._get_platform()
     self._openstack = shade.openstack_cloud()
     self._keypair_name = self.get_keypair_name()
     self._molecule_generated_ssh_key = False
def main():

    parser = argparse.ArgumentParser()
    parser.add_argument('-r', '--max_routers', type=int, default=100)
    args = parser.parse_args()
    agent_status = STATE_OK

    search_opts = {
        'all_tenants': True,
        }
		
    cloud = shade.openstack_cloud()
    neutron = cloud.neutron_client
    router_list = neutron.list_routers()
    if len(router_list['routers']) > args.max_routers:
        print("WARNING: Number of routers more than the max: %d"
              % args.max_routers)
        sys.exit(STATE_WARNING)

    for router in router_list['routers']:
        search_opts['router'] = router['id']
        router_agents = neutron.list_l3_agent_hosting_routers(**search_opts)
        agent_status = check_router(router, router_agents)
        if agent_status == STATE_CRITICAL:
            sys.exit(STATE_CRITICAL)
        elif agent_status == STATE_WARNING:
            sys.exit(STATE_WARNING)

    if agent_status == STATE_OK:
        print("OK: No routers with multiple active or all inactive l3 agents")
        sys.exit(STATE_OK)
Пример #10
0
 def setUp(self):
     super(TestNetwork, self).setUp()
     self.cloud = openstack_cloud(cloud='devstack-admin')
     if not self.cloud.has_service('network'):
         self.skipTest('Network service not supported by cloud')
     self.network_name = self.getUniqueString('network')
     self.addCleanup(self._cleanup_networks)
Пример #11
0
def main():

    argument_spec = openstack_full_argument_spec(
        server=dict(required=False),
        detailed=dict(required=False, type='bool'),
    )
    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(argument_spec, **module_kwargs)

    if not HAS_SHADE:
        module.fail_json(msg='shade is required for this module')

    try:
        cloud = shade.openstack_cloud(**module.params)
        openstack_servers = cloud.list_servers(
            detailed=module.params['detailed'])

        if module.params['server']:
            # filter servers by name
            pattern = module.params['server']
            openstack_servers = [server for server in openstack_servers
                                 if fnmatch.fnmatch(server['name'], pattern)]
        module.exit_json(changed=False, ansible_facts=dict(
            openstack_servers=openstack_servers))

    except shade.OpenStackCloudException as e:
        module.fail_json(msg=e.message)
Пример #12
0
    def _getClient(self):
        kwargs = {}
        if self.provider.region_name:
            kwargs['region_name'] = self.provider.region_name
        if self.provider.api_timeout:
            kwargs['api_timeout'] = self.provider.api_timeout
        # These are named from back when we only talked to Nova. They're
        # actually compute service related
        if self.provider.service_type:
            kwargs['compute_service_type'] = self.provider.service_type
        if self.provider.service_name:
            kwargs['compute_service_name'] = self.provider.service_name
        if self.provider.cloud is not None:
            kwargs['cloud'] = self.provider.cloud

        auth_kwargs = {}
        for auth_attr in ('username', 'password', 'auth_url'):
            auth_val = getattr(self.provider, auth_attr)
            if auth_val is not None:
                auth_kwargs[auth_attr] = auth_val

        if self.provider.project_id is not None:
            auth_kwargs['project_name'] = self.provider.project_id

        kwargs['auth'] = auth_kwargs
        return shade.openstack_cloud(**kwargs)
Пример #13
0
def main():

    argument_spec = openstack_full_argument_spec(
        name=dict(required=True),
        description=dict(required=False, default=None),
        domain_id=dict(required=False, default=None, aliases=['domain']),
        enabled=dict(default=True, type='bool'),
        state=dict(default='present', choices=['absent', 'present'])
    )

    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(
        argument_spec,
        supports_check_mode=True,
        **module_kwargs
    )

    if not HAS_SHADE:
        module.fail_json(msg='shade is required for this module')

    name = module.params['name']
    description = module.params['description']
    domain = module.params['domain_id']
    enabled = module.params['enabled']
    state = module.params['state']

    try:
        cloud = shade.openstack_cloud(**module.params)
        project = cloud.get_project(name)

        if module.check_mode:
            module.exit_json(changed=_system_state_change(module, project))

        if state == 'present':
            if project is None:
                project = cloud.create_project(
                    name=name, description=description,
                    domain_id=domain,
                    enabled=enabled)
                changed = True
            else:
                if _needs_update(module, project):
                    project = cloud.update_project(
                        project['id'], description=description,
                        enabled=enabled)
                    changed = True
                else:
                    changed = False
            module.exit_json(changed=changed, project=project)

        elif state == 'absent':
            if project is None:
                changed=False
            else:
                cloud.delete_project(project['id'])
                changed=True
            module.exit_json(changed=changed)

    except shade.OpenStackCloudException as e:
        module.fail_json(msg=e.message, extra_data=e.extra_data)
def main():
    ''' Main module function '''
    module = AnsibleModule(argument_spec={}, supports_check_mode=True)

    if not HAS_SHADE:
        module.fail_json(msg='shade is required for this module')

    try:
        cloud = shade.openstack_cloud()
    # pylint: disable=broad-except
    except Exception:
        module.fail_json(msg='Failed to connect to the cloud')

    try:
        service_catalog = cloud.cloud_config.get_service_catalog()
    # pylint: disable=broad-except
    except Exception:
        module.fail_json(msg='Failed to retrieve the service catalog')

    try:
        endpoints = service_catalog.get_endpoints()
    # pylint: disable=broad-except
    except Exception:
        module.fail_json(msg='Failed to retrieve the service catalog '
                         'endpoints')

    module.exit_json(
        changed=False,
        ansible_facts={'openstack_service_catalog': endpoints})
Пример #15
0
def main():
    argument_spec = openstack_full_argument_spec(
        server=dict(required=True),
        state=dict(default='present', choices=['absent', 'present']),
        network=dict(required=False, default=None),
        floating_ip_address=dict(required=False, default=None),
        reuse=dict(required=False, type='bool', default=False),
        fixed_address=dict(required=False, default=None),
        wait=dict(required=False, type='bool', default=False),
        timeout=dict(required=False, type='int', default=60),
    )

    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(argument_spec, **module_kwargs)

    if not HAS_SHADE:
        module.fail_json(msg='shade is required for this module')

    server_name_or_id = module.params['server']
    state = module.params['state']
    network = module.params['network']
    floating_ip_address = module.params['floating_ip_address']
    reuse = module.params['reuse']
    fixed_address = module.params['fixed_address']
    wait = module.params['wait']
    timeout = module.params['timeout']

    cloud = shade.openstack_cloud(**module.params)

    try:
        server = cloud.get_server(server_name_or_id)
        if server is None:
            module.fail_json(
                msg="server {0} not found".format(server_name_or_id))

        if state == 'present':
            server = cloud.add_ips_to_server(
                server=server, ips=floating_ip_address, ip_pool=network,
                reuse=reuse, fixed_address=fixed_address, wait=wait,
                timeout=timeout)
            fip_address = cloud.get_server_public_ip(server)
            # Update the floating IP status
            f_ip = _get_floating_ip(cloud, fip_address)
            module.exit_json(changed=True, floating_ip=f_ip)

        elif state == 'absent':
            if floating_ip_address is None:
                module.fail_json(msg="floating_ip_address is required")

            f_ip = _get_floating_ip(cloud, floating_ip_address)

            cloud.detach_ip_from_server(
                server_id=server['id'], floating_ip_id=f_ip['id'])
            # Update the floating IP status
            f_ip = cloud.get_floating_ip(id=f_ip['id'])
            module.exit_json(changed=True, floating_ip=f_ip)

    except shade.OpenStackCloudException as e:
        module.fail_json(msg=str(e), extra_data=e.extra_data)
Пример #16
0
def main():
    argument_spec = openstack_full_argument_spec(
        name            = dict(required=True),
        public_key      = dict(default=None),
        public_key_file = dict(default=None),
        state           = dict(default='present',
                               choices=['absent', 'present']),
    )

    module_kwargs = openstack_module_kwargs(
        mutually_exclusive=[['public_key', 'public_key_file']])

    module = AnsibleModule(argument_spec,
                           supports_check_mode=True,
                           **module_kwargs)

    if not HAS_SHADE:
        module.fail_json(msg='shade is required for this module')

    state = module.params['state']
    name = module.params['name']
    public_key = module.params['public_key']

    if module.params['public_key_file']:
        public_key = open(module.params['public_key_file']).read()
        public_key = public_key.rstrip()

    try:
        cloud = shade.openstack_cloud(**module.params)
        keypair = cloud.get_keypair(name)

        if module.check_mode:
            module.exit_json(changed=_system_state_change(module, keypair))

        if state == 'present':
            if keypair and keypair['name'] == name:
                if public_key and (public_key != keypair['public_key']):
                    module.fail_json(
                        msg="Key name %s present but key hash not the same"
                            " as offered. Delete key first." % name
                    )
                else:
                    changed = False
            else:
                keypair = cloud.create_keypair(name, public_key)
                changed = True

            module.exit_json(changed=changed,
                             key=keypair,
                             id=keypair['id'])

        elif state == 'absent':
            if keypair:
                cloud.delete_keypair(name)
                module.exit_json(changed=True)
            module.exit_json(changed=False)

    except shade.OpenStackCloudException as e:
        module.fail_json(msg=str(e))
Пример #17
0
 def setUp(self):
     super(TestNetwork, self).setUp()
     self.cloud = openstack_cloud(cloud='devstack-admin')
     if not self.cloud.has_service('network'):
         self.skipTest('Network service not supported by cloud')
     self.network_prefix = 'test_network' + ''.join(
         random.choice(string.ascii_lowercase) for _ in range(5))
     self.addCleanup(self._cleanup_networks)
    def get_cloud(self):
        """ Get shade openstack and operator cloud objects

        :return: cloud, opcloud are the shade openstack and operator objects
        """
        cloud = shade.openstack_cloud()
        opcloud = shade.operator_cloud()
        return cloud, opcloud
Пример #19
0
    def test_get_server_external_ipv4_neutron_accessIPv4(self):
        srv = meta.obj_to_dict(fakes.FakeServer(
            id='test-id', name='test-name', status='ACTIVE',
            accessIPv4=PUBLIC_V4))
        ip = meta.get_server_external_ipv4(
            cloud=shade.openstack_cloud(validate=False), server=srv)

        self.assertEqual(PUBLIC_V4, ip)
Пример #20
0
def build_inventory():
    '''Build the dynamic inventory.'''
    cloud = shade.openstack_cloud()

    # TODO(shadower): filter the servers based on the `OPENSHIFT_CLUSTER`
    # environment variable.
    cluster_hosts = [
        server for server in cloud.list_servers()
        if 'metadata' in server and 'clusterid' in server.metadata]

    inventory = base_openshift_inventory(cluster_hosts)

    inventory['_meta'] = {'hostvars': {}}

    # Some clouds don't have Cinder. That's okay:
    try:
        volumes = cloud.list_volumes()
    except EndpointNotFound:
        volumes = []

    # cinder volumes used for docker storage
    docker_storage_mountpoints = get_docker_storage_mountpoints(volumes)
    for server in cluster_hosts:
        inventory['_meta']['hostvars'][server.name] = _get_hostvars(
            server,
            docker_storage_mountpoints)

    stout = _get_stack_outputs(cloud)
    if stout is not None:
        try:
            inventory['localhost'].update({
                'openshift_openstack_api_lb_provider':
                stout['api_lb_provider'],
                'openshift_openstack_api_lb_port_id':
                stout['api_lb_vip_port_id'],
                'openshift_openstack_api_lb_sg_id':
                stout['api_lb_sg_id']})
        except KeyError:
            pass  # Not an API load balanced deployment

        try:
            inventory['OSEv3']['vars'][
                'openshift_master_cluster_hostname'] = stout['private_api_ip']
        except KeyError:
            pass  # Internal LB not specified

        inventory['localhost']['openshift_openstack_private_api_ip'] = \
            stout.get('private_api_ip')
        inventory['localhost']['openshift_openstack_public_api_ip'] = \
            stout.get('public_api_ip')
        inventory['localhost']['openshift_openstack_public_router_ip'] = \
            stout.get('public_router_ip')

        try:
            inventory['OSEv3']['vars'] = _get_kuryr_vars(cloud, stout)
        except KeyError:
            pass  # Not a kuryr deployment
    return inventory
Пример #21
0
def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("name", help="server name")
    options = parser.parse_args()

    import shade
    cloud = shade.openstack_cloud()
    server = cloud.get_server(options.name)
    print_dns(cloud, server)
Пример #22
0
    def setUp(self):
        super(TestFlavor, self).setUp()
        self.demo_cloud = shade.openstack_cloud(cloud="devstack")
        self.operator_cloud = shade.operator_cloud(cloud="devstack-admin")

        # Generate a random name for flavors in this test
        self.new_item_name = "flavor_" + "".join(random.choice(string.ascii_lowercase) for _ in range(5))

        self.addCleanup(self._cleanup_flavors)
Пример #23
0
    def setUp(self):
        super(TestFloatingIPPool, self).setUp()
        self.cloud = openstack_cloud(cloud='devstack')

        if not self.cloud._has_nova_extension('os-floating-ip-pools'):
            # Skipping this test is floating-ip-pool extension is not
            # available on the testing cloud
            self.skip(
                'Floating IP pools extension is not available')
Пример #24
0
    def setUp(self):
        super(TestFloatingIPPool, self).setUp()
        # Shell should have OS-* envvars from openrc, typically loaded by job
        self.cloud = openstack_cloud()

        if not self.cloud._has_nova_extension("os-floating-ip-pools"):
            # Skipping this test is floating-ip-pool extension is not
            # available on the testing cloud
            self.skip("Floating IP pools extension is not available")
Пример #25
0
def main():

    argument_spec = openstack_full_argument_spec(
        name=dict(required=True),
        template=dict(default=None),
        environment=dict(default=None, type='list'),
        parameters=dict(default={}, type='dict'),
        rollback=dict(default=False, type='bool'),
        timeout=dict(default=3600, type='int'),
        state=dict(default='present', choices=['absent', 'present']),
    )

    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(argument_spec,
                           supports_check_mode=True,
                           **module_kwargs)

    # stack API introduced in 1.8.0
    if not HAS_SHADE or (StrictVersion(shade.__version__) < StrictVersion('1.8.0')):
        module.fail_json(msg='shade 1.8.0 or higher is required for this module')

    state = module.params['state']
    name = module.params['name']
    # Check for required parameters when state == 'present'
    if state == 'present':
        for p in ['template']:
            if not module.params[p]:
                module.fail_json(msg='%s required with present state' % p)

    try:
        cloud = shade.openstack_cloud(**module.params)
        stack = cloud.get_stack(name)

        if module.check_mode:
            module.exit_json(changed=_system_state_change(module, stack,
                                                          cloud))

        if state == 'present':
            if not stack:
                stack = _create_stack(module, stack, cloud)
            else:
                stack = _update_stack(module, stack, cloud)
            changed = True
            module.exit_json(changed=changed,
                             stack=stack,
                             id=stack.id)
        elif state == 'absent':
            if not stack:
                changed = False
            else:
                changed = True
                if not cloud.delete_stack(name, wait=module.params['wait']):
                    module.fail_json(msg='delete stack failed for stack: %s' % name)
            module.exit_json(changed=changed)
    except shade.OpenStackCloudException as e:
        module.fail_json(msg=str(e))
Пример #26
0
 def setUp(self):
     super(TestCompute, self).setUp()
     self.cloud = openstack_cloud(cloud='devstack')
     self.nova = self.cloud.nova_client
     self.flavor = pick_flavor(self.nova.flavors.list())
     if self.flavor is None:
         self.assertFalse('no sensible flavor available')
     self.image = pick_image(self.nova.images.list())
     if self.image is None:
         self.assertFalse('no sensible image available')
Пример #27
0
 def setUp(self):
     super(TestCompute, self).setUp()
     self.cloud = openstack_cloud(cloud='devstack')
     self.flavor = pick_flavor(self.cloud.list_flavors())
     if self.flavor is None:
         self.assertFalse('no sensible flavor available')
     self.image = pick_image(self.cloud.list_images())
     if self.image is None:
         self.assertFalse('no sensible image available')
     self.server_name = self.getUniqueString()
Пример #28
0
    def __init__(self, options: argparse.Namespace) -> None:
        self.options = options

        self.revoke_role_after_purge = False
        self.disable_project_after_purge = False

        self.cloud = None  # type: Optional[shade.OpenStackCloud]
        self.operator_cloud = None  # type: Optional[shade.OperatorCloud]

        if options.purge_own_project:
            self.cloud = shade.openstack_cloud(argparse=options)
            self.user_id = self.cloud.keystone_session.get_user_id()
            self.project_id = self.cloud.keystone_session.get_project_id()
        else:
            self.operator_cloud = shade.operator_cloud(argparse=options)
            self.user_id = self.operator_cloud.keystone_session.get_user_id()

            project = self.operator_cloud.get_project(options.purge_project)
            if not project:
                raise exceptions.OSProjectNotFound(
                    "Unable to find project '{}'".format(options.purge_project)
                )
            self.project_id = project['id']

            # If project is not enabled, we must disable it after purge.
            self.disable_project_after_purge = not project.enabled

            # Reuse the information passed to get the `OperatorCloud` but
            # change the project. This way we bind/re-scope to the project
            # we want to purge, not the project we authenticated to.
            self.cloud = shade.openstack_cloud(
                **utils.replace_project_info(
                    self.operator_cloud.cloud_config.config,
                    self.project_id
                )
            )

        auth_args = self.cloud.cloud_config.get_auth_args()
        logging.warning(
            "Going to list and/or delete resources from project '%s'",
            options.purge_project or auth_args.get('project_name')
            or auth_args.get('project_id')
        )
def main():
    ''' Main module function '''
    module = AnsibleModule(
        argument_spec=dict(
            router_id=dict(default=False, type='str'),
            subnet_id=dict(default=False, type='str'),
            net_id=dict(default=False, type='str'),
            sg_id=dict(default=False, type='str'),
        ),
        supports_check_mode=True,
    )

    if not HAS_SHADE:
        module.fail_json(msg='shade is required for this module')

    try:
        cloud = shade.openstack_cloud()
    # pylint: disable=broad-except
    except Exception:
        module.fail_json(msg='Failed to connect to the cloud')

    try:
        adapter = keystoneauth1.adapter.Adapter(
            session=cloud.keystone_session,
            service_type=cloud.cloud_config.get_service_type('network'),
            interface=cloud.cloud_config.get_interface('network'),
            endpoint_override=cloud.cloud_config.get_endpoint('network'),
            version=cloud.cloud_config.get_api_version('network'))
    # pylint: disable=broad-except
    except Exception:
        module.fail_json(msg='Failed to get an adapter to talk to the Neutron '
                             'API')

    try:
        subnet_info = {"subnet_id": module.params['subnet_id'].encode('ascii')}
        data = {'data': str(subnet_info).replace('\'', '\"')}
        adapter.put('/routers/' + module.params['router_id'] + '/remove_router_interface', **data)
    # pylint: disable=broad-except
    except Exception:
        module.fail_json(msg='Failed to detach subnet from the router')

    try:
        adapter.delete('/networks/' + module.params['net_id'])
    # pylint: disable=broad-except
    except Exception:
        module.fail_json(msg='Failed to delete Neutron Network associated to the namespace')

    try:
        adapter.delete('/security-groups/' + module.params['sg_id'])
    # pylint: disable=broad-except
    except Exception:
        module.fail_json(msg='Failed to delete Security groups associated to the namespace')

    module.exit_json(
        changed=True)
Пример #30
0
def main():

    argument_spec = openstack_full_argument_spec(
        stack_name=dict(required=True),
        template=dict(default=None),
        environment_files=dict(default=None, type='dict'),
        state=dict(default='present', choices=['absent', 'present']),
    )

    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(argument_spec,
                           supports_check_mode=True,
                           **module_kwargs)

    if not HAS_SHADE:
        module.fail_json(msg='shade is required for this module')

    state = module.params['state']
    stack_name = module.params['stack_name']
    template = module.params['template']
    environment_files = module.params['environment_files']

    # Check for required parameters when state == 'present'
    if state == 'present':
        for p in ['stack_name', 'template']:
            if not module.params[p]:
                module.fail_json(msg='%s required with present state' % p)

    try:
        cloud = shade.openstack_cloud(**module.params)
        stack = cloud.get_stack(stack_name)

        if module.check_mode:
            module.exit_json(changed=_system_state_change(module, stack,
                                                          cloud))

        if state == 'present':
            if not stack:
                stack = _create_stack(module, stack, cloud)
                changed = True
            else:
                changed = False
            module.exit_json(changed=changed,
                             stack=stack,
                             id=stack['id'])
        elif state == 'absent':
            if not stack:
                changed = False
            else:
                changed = True
                cloud.delete_stack(stack_name)
            module.exit_json(changed=changed)

    except shade.OpenStackCloudException as e:
        module.fail_json(msg=e.message)
Пример #31
0
import shade
shade.simple_logging(http_debug=True)

cloud = shade.openstack_cloud(
    cloud='my-vexxhost', region_name='ca-ymq-1')
cloud.get_image('Ubuntu 16.04.1 LTS [2017-03-03]')
Пример #32
0
 def setUp(self):
     super(TestImage, self).setUp()
     self.cloud = openstack_cloud(cloud='devstack')
     self.image = pick_image(self.cloud.nova_client.images.list())
Пример #33
0
import shade
shade.simple_logging(debug=True)

cloud = shade.openstack_cloud(cloud='rax', region_name='DFW')
print(cloud.has_service('network'))
Пример #34
0
#!/usr/bin/python
import shade

shade.simple_logging(debug=True)
cloud = shade.openstack_cloud(cloud='defaults')
print(cloud.get_flavor_by_ram(512))
Пример #35
0
def create_openstack_instance(instance_name,
                              image_name,
                              volume_size,
                              flavor_name=None,
                              ssh_key=None,
                              network_name=None):
    """Creates openstack Instance from Image and Assigns a floating IP
    to instance. Also It ensures that instance is ready for testing.

    :param instance_name: A string. Openstack Instance name to create.
    :param image_name: A string. Openstack image name from which instance
        to be created.
    :param volume_size: A string. Volume size to be created for osp instance
    :param flavor_name: A string. Openstack flavor_name for instance.
        e.g m1.small.
    :param ssh_key: A string. ssh_key 'name' that required to add
        into this instance.
    :param network_name: A string. Network 'name' that required to create
        this instance.

    ssh_key should be added to openstack project before running automation.
    Else the automation will fail.

    The following environment variables affect this command:

    FLAVOR_NAME
        Openstack flavor name to create compute settings for instance
    NETWORK_NAME
        Name of the network where the instance is created
    SSH_KEY
        ssh key to be added into the instance from openstack
    """
    if float(re.search(r'\d{1,2}.\d{1,2}',
                       os.environ["RHEL7_IMAGE"]).group()) >= 7.7:
        env.user = "******"
    else:
        env.user = '******'
    env.disable_known_hosts = True
    if flavor_name is None:
        flavor_name = flavor_name or os.environ.get('FLAVOR_NAME')
    if network_name is None:
        network_name = network_name or os.environ.get('NETWORK_NAME')
    if ssh_key is None:
        ssh_key = ssh_key or os.environ.get('OSP_SSHKEY')
    openstack_client = shade.openstack_cloud(cloud='satellite-jenkins')
    # Validate image is added into openstack project
    image = openstack_client.get_image(image_name)
    volume_name = '{0}_volume'.format(instance_name)
    logger.info('Creating new Openstack Volume {0}'.format(volume_name))
    openstack_client.create_volume(size=volume_size,
                                   name=volume_name,
                                   bootable=True,
                                   image=image.id)
    # Create instance from the given parameters
    logger.info('Creating new Openstack instance {0}'.format(instance_name))
    instance = openstack_client.create_server(name=instance_name,
                                              flavor=flavor_name,
                                              boot_from_volume=True,
                                              key_name=ssh_key,
                                              network=network_name,
                                              boot_volume=volume_name,
                                              terminate_volume=True,
                                              wait=True)
    if instance.interface_ip:
        ip_addr = instance.interface_ip
    else:
        logger.error("No floating Ip assigned")

    # Wait till DNS resolves the IP
    logger.info('Pinging the Host by IP:{0} ..........'.format(ip_addr))
    host_ssh_availability_check(ip_addr)
    host_pings(str(ip_addr))
    logger.info('SUCCESS !! The given IP has been pinged!!\n')
    logger.info('Now, Getting the hostname from IP......\n')
    hostname = get_osp_hostname(ip_addr)
    if not hostname:
        sys.exit(1)
    logger.info('Pinging the Hostname:{0} ..........'.format(hostname))
    host_pings(hostname)
    logger.info('SUCCESS !! The obtained hostname from IP is pinged !!')
    if env.user == "cloud-user":
        # Copied the authorized key from cloud-user to root
        execute(lambda: run(
            "sudo cp ~/.ssh/authorized_keys /root/.ssh/authorized_keys"),
                host=hostname)
        # To activate the root access need to execute cloud-init init
        execute(lambda: run("sudo cloud-init init 2>/dev/null 1>/dev/null"),
                host=hostname)
        env.user = "******"

    # Update the /etc/hosts file
    execute(lambda: run("hostnamectl set-hostname {0}".format(hostname)),
            host=hostname)
    execute(
        lambda: run("echo {0} {1} >> /etc/hosts".format(ip_addr, hostname)),
        host=hostname)
    with open('/tmp/instance.info', 'w') as outfile:
        outfile.write('OSP_HOSTNAME={0}'.format(hostname))
    return instance
def main():
    argument_spec = openstack_full_argument_spec(
        security_group   = dict(required=True),
        # NOTE(Shrews): None is an acceptable protocol value for
        # Neutron, but Nova will balk at this.
        protocol         = dict(default=None,
                                choices=[None, 'tcp', 'udp', 'icmp', '112']),
        port_range_min   = dict(required=False, type='int'),
        port_range_max   = dict(required=False, type='int'),
        remote_ip_prefix = dict(required=False, default=None),
        remote_group     = dict(required=False, default=None),
        ethertype        = dict(default='IPv4',
                                choices=['IPv4', 'IPv6']),
        direction        = dict(default='ingress',
                                choices=['egress', 'ingress']),
        state            = dict(default='present',
                                choices=['absent', 'present']),
    )

    module_kwargs = openstack_module_kwargs(
        mutually_exclusive=[
            ['remote_ip_prefix', 'remote_group'],
        ]
    )

    module = AnsibleModule(argument_spec,
                           supports_check_mode=True,
                           **module_kwargs)

    if not HAS_SHADE:
        module.fail_json(msg='shade is required for this module')

    state = module.params['state']
    security_group = module.params['security_group']
    remote_group = module.params['remote_group']
    changed = False

    try:
        cloud = shade.openstack_cloud(**module.params)
        secgroup = cloud.get_security_group(security_group)

        if remote_group:
            remotegroup = cloud.get_security_group(remote_group)
        else:
            remotegroup = { 'id' : None }

        if module.check_mode:
            module.exit_json(changed=_system_state_change(module, secgroup, remotegroup))

        if state == 'present':
            if not secgroup:
                module.fail_json(msg='Could not find security group %s' %
                                 security_group)

            rule = _find_matching_rule(module, secgroup, remotegroup)
            if not rule:
                rule = cloud.create_security_group_rule(
                    secgroup['id'],
                    port_range_min=module.params['port_range_min'],
                    port_range_max=module.params['port_range_max'],
                    protocol=module.params['protocol'],
                    remote_ip_prefix=module.params['remote_ip_prefix'],
                    remote_group_id=remotegroup['id'],
                    direction=module.params['direction'],
                    ethertype=module.params['ethertype']
                )
                changed = True
            module.exit_json(changed=changed, rule=rule, id=rule['id'])

        if state == 'absent' and secgroup:
            rule = _find_matching_rule(module, secgroup, remotegroup)
            if rule:
                cloud.delete_security_group_rule(rule['id'])
                changed = True

            module.exit_json(changed=changed)

    except shade.OpenStackCloudException as e:
        module.fail_json(msg=str(e))
Пример #37
0
def main():

    argument_spec = openstack_full_argument_spec(
        name=dict(required=True),
        password=dict(required=False, default=None, no_log=True),
        email=dict(required=False, default=None),
        default_project=dict(required=False, default=None),
        domain=dict(required=False, default=None),
        enabled=dict(default=True, type='bool'),
        state=dict(default='present', choices=['absent', 'present']),
        update_password=dict(default='always', choices=['always',
                                                        'on_create']),
    )

    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(argument_spec, **module_kwargs)

    if not HAS_SHADE:
        module.fail_json(msg='shade is required for this module')

    name = module.params['name']
    password = module.params.pop('password')
    email = module.params['email']
    default_project = module.params['default_project']
    domain = module.params['domain']
    enabled = module.params['enabled']
    state = module.params['state']
    update_password = module.params['update_password']

    try:
        cloud = shade.openstack_cloud(**module.params)
        user = cloud.get_user(name)

        domain_id = None
        if domain:
            opcloud = shade.operator_cloud(**module.params)
            domain_id = _get_domain_id(opcloud, domain)

        if state == 'present':
            if update_password in ('always', 'on_create'):
                if not password:
                    msg = ("update_password is %s but a password value is "
                           "missing") % update_password
                    module.fail_json(msg=msg)
            default_project_id = None
            if default_project:
                default_project_id = _get_default_project_id(
                    cloud, default_project)

            if user is None:
                user = cloud.create_user(name=name,
                                         password=password,
                                         email=email,
                                         default_project=default_project_id,
                                         domain_id=domain_id,
                                         enabled=enabled)
                changed = True
            else:
                params_dict = {
                    'email': email,
                    'enabled': enabled,
                    'password': password,
                    'update_password': update_password
                }
                if domain_id is not None:
                    params_dict['domain_id'] = domain_id
                if default_project_id is not None:
                    params_dict['default_project_id'] = default_project_id

                if _needs_update(params_dict, user):
                    if update_password == 'always':
                        user = cloud.update_user(
                            user['id'],
                            password=password,
                            email=email,
                            default_project=default_project_id,
                            domain_id=domain_id,
                            enabled=enabled)
                    else:
                        user = cloud.update_user(
                            user['id'],
                            email=email,
                            default_project=default_project_id,
                            domain_id=domain_id,
                            enabled=enabled)
                    changed = True
                else:
                    changed = False
            module.exit_json(changed=changed, user=user)

        elif state == 'absent':
            if user is None:
                changed = False
            else:
                cloud.delete_user(user['id'])
                changed = True
            module.exit_json(changed=changed)

    except shade.OpenStackCloudException as e:
        module.fail_json(msg=str(e), extra_data=e.extra_data)
# get options
argparser = argparse.ArgumentParser()
argparser.add_argument('--criticality',
                       '-z',
                       help='Set sensu alert level, critical is default',
                       default='critical')
options = argparser.parse_args()

# set alert level
if options.criticality == 'critical':
    exit_alert_state = STATE_CRITICAL
else:
    exit_alert_state = STATE_WARNING

# get cinder service list with down state
cloud = shade.openstack_cloud()
cinder = cloud.cinder_client

services_down = []
for service in cinder.services.list():
    if service.state == 'down':
        services_down.append(service)

if len(services_down) > 0:
    print "Alert: %d Cinder service(s) down" % len(services_down)
    print services_down
    sys.exit(exit_alert_state)
else:
    print "OK: No Cinder service(s) down"
    sys.exit(STATE_OK)
Пример #39
0
def main():
    argument_spec = openstack_full_argument_spec(
        name=dict(required=True),
        zone_type=dict(required=False, choice=['primary', 'secondary']),
        email=dict(required=False, default=None),
        description=dict(required=False, default=None),
        ttl=dict(required=False, default=None, type='int'),
        masters=dict(required=False, default=None, type='list'),
        state=dict(default='present', choices=['absent', 'present']),
    )

    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(argument_spec,
                           supports_check_mode=True,
                           **module_kwargs)

    if not HAS_SHADE:
        module.fail_json(msg='shade is required for this module')
    if StrictVersion(shade.__version__) < StrictVersion('1.8.0'):
        module.fail_json(msg="To utilize this module, the installed version of"
                         "the shade library MUST be >=1.8.0")

    name = module.params.get('name')
    state = module.params.get('state')

    try:
        cloud = shade.openstack_cloud(**module.params)
        zone = cloud.get_zone(name)

        if state == 'present':
            zone_type = module.params.get('zone_type')
            email = module.params.get('email')
            description = module.params.get('description')
            ttl = module.params.get('ttl')
            masters = module.params.get('masters')

            if module.check_mode:
                module.exit_json(changed=_system_state_change(
                    state, email, description, ttl, masters, zone))

            if zone is None:
                zone = cloud.create_zone(name=name,
                                         zone_type=zone_type,
                                         email=email,
                                         description=description,
                                         ttl=ttl,
                                         masters=masters)
                changed = True
            else:
                if masters is None:
                    masters = []

                pre_update_zone = zone
                changed = _system_state_change(state, email, description, ttl,
                                               masters, pre_update_zone)
                if changed:
                    zone = cloud.update_zone(name,
                                             email=email,
                                             description=description,
                                             ttl=ttl,
                                             masters=masters)
            module.exit_json(changed=changed, zone=zone)

        elif state == 'absent':
            if module.check_mode:
                module.exit_json(changed=_system_state_change(
                    state, None, None, None, None, zone))

            if zone is None:
                changed = False
            else:
                cloud.delete_zone(name)
                changed = True
            module.exit_json(changed=changed)

    except shade.OpenStackCloudException as e:
        module.fail_json(msg=str(e))
Пример #40
0
def main():
    argument_spec = openstack_full_argument_spec(
        zone=dict(required=True),
        name=dict(required=True),
        recordset_type=dict(required=False),
        records=dict(required=False, type='list'),
        description=dict(required=False, default=None),
        ttl=dict(required=False, default=None, type='int'),
        state=dict(default='present', choices=['absent', 'present']),
    )

    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(argument_spec,
                           required_if=[
                               ('state', 'present',
                                ['recordset_type', 'records'])],
                           supports_check_mode=True,
                           **module_kwargs)

    if not HAS_SHADE:
        module.fail_json(msg='shade is required for this module')
    if StrictVersion(shade.__version__) <= StrictVersion('1.8.0'):
        module.fail_json(msg="To utilize this module, the installed version of "
                             "the shade library MUST be >1.8.0")

    zone = module.params.get('zone')
    name = module.params.get('name')
    state = module.params.get('state')

    try:
        cloud = shade.openstack_cloud(**module.params)
        recordset = cloud.get_recordset(zone, name + '.' + zone)


        if state == 'present':
            recordset_type = module.params.get('recordset_type')
            records = module.params.get('records')
            description = module.params.get('description')
            ttl = module.params.get('ttl')

            if module.check_mode:
                module.exit_json(changed=_system_state_change(state,
                                                              records, description,
                                                              ttl, zone,
                                                              recordset))

            if recordset is None:
                recordset = cloud.create_recordset(
                    zone=zone, name=name, recordset_type=recordset_type,
                    records=records, description=description, ttl=ttl)
                changed = True
            else:
                if records is None:
                    records = []

                pre_update_recordset = recordset
                changed = _system_state_change(state, records,
                                               description, ttl,
                                               zone, pre_update_recordset)
                if changed:
                    zone = cloud.update_recordset(
                        zone, name + '.' + zone,
                        records=records,
                        description=description,
                        ttl=ttl)
            module.exit_json(changed=changed, recordset=recordset)

        elif state == 'absent':
            if module.check_mode:
                module.exit_json(changed=_system_state_change(state,
                                                              None, None,
                                                              None,
                                                              None, recordset))

            if recordset is None:
                changed=False
            else:
                cloud.delete_recordset(zone, name + '.' + zone)
                changed=True
            module.exit_json(changed=changed)

    except shade.OpenStackCloudException as e:
        module.fail_json(msg=str(e))
 def __init__(self):
     self.cloud = shade.openstack_cloud()
Пример #42
0
def main():
    argument_spec = openstack_full_argument_spec(
        name=dict(required=True),
        shared=dict(default=False, type='bool'),
        admin_state_up=dict(default=True, type='bool'),
        external=dict(default=False, type='bool'),
        provider_physical_network=dict(required=False),
        provider_network_type=dict(required=False),
        provider_segmentation_id=dict(required=False),
        state=dict(default='present', choices=['absent', 'present']),
        project=dict(default=None))

    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(argument_spec, **module_kwargs)

    if not HAS_SHADE:
        module.fail_json(msg='shade is required for this module')

    if (module.params['project']
            and StrictVersion(shade.__version__) < StrictVersion('1.6.0')):
        module.fail_json(msg="To utilize project, the installed version of"
                         "the shade library MUST be >=1.6.0")

    state = module.params['state']
    name = module.params['name']
    shared = module.params['shared']
    admin_state_up = module.params['admin_state_up']
    external = module.params['external']
    provider_physical_network = module.params['provider_physical_network']
    provider_network_type = module.params['provider_network_type']
    provider_segmentation_id = module.params['provider_segmentation_id']
    project = module.params.pop('project')

    try:
        cloud = shade.openstack_cloud(**module.params)
        if project is not None:
            proj = cloud.get_project(project)
            if proj is None:
                module.fail_json(msg='Project %s could not be found' % project)
            project_id = proj['id']
            filters = {'tenant_id': project_id}
        else:
            project_id = None
            filters = None
        net = cloud.get_network(name, filters=filters)

        if state == 'present':
            if not net:
                provider = {}
                if provider_physical_network:
                    provider['physical_network'] = provider_physical_network
                if provider_network_type:
                    provider['network_type'] = provider_network_type
                if provider_segmentation_id:
                    provider['segmentation_id'] = provider_segmentation_id

                if provider and StrictVersion(
                        shade.__version__) < StrictVersion('1.5.0'):
                    module.fail_json(
                        msg="Shade >= 1.5.0 required to use provider options")

                if project_id is not None:
                    net = cloud.create_network(name, shared, admin_state_up,
                                               external, provider, project_id)
                else:
                    net = cloud.create_network(name, shared, admin_state_up,
                                               external, provider)
                changed = True
            else:
                changed = False
            module.exit_json(changed=changed, network=net, id=net['id'])

        elif state == 'absent':
            if not net:
                module.exit_json(changed=False)
            else:
                cloud.delete_network(name)
                module.exit_json(changed=True)

    except shade.OpenStackCloudException as e:
        module.fail_json(msg=str(e))
Пример #43
0
 def setUp(self):
     super(TestRangeSearch, self).setUp()
     self.cloud = shade.openstack_cloud(cloud='devstack')
Пример #44
0
def main():
    argument_spec = openstack_full_argument_spec(
        server=dict(required=True),
        state=dict(default='present', choices=['absent', 'present']),
        network=dict(required=False, default=None),
        floating_ip_address=dict(required=False, default=None),
        reuse=dict(required=False, type='bool', default=False),
        fixed_address=dict(required=False, default=None),
        wait=dict(required=False, type='bool', default=False),
        timeout=dict(required=False, type='int', default=60),
        purge=dict(required=False, type='bool', default=False),
        internal_network=dict(required=False, default=None),
    )

    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(argument_spec, **module_kwargs)

    if not HAS_SHADE:
        module.fail_json(msg='shade is required for this module')

    server_name_or_id = module.params['server']
    state = module.params['state']
    network = module.params['network']
    floating_ip_address = module.params['floating_ip_address']
    reuse = module.params['reuse']
    fixed_address = module.params['fixed_address']
    wait = module.params['wait']
    timeout = module.params['timeout']
    purge = module.params['purge']
    internal_network = module.params['internal_network']

    # cloud = shade.openstack_cloud(**module.params)
    # shade breaks when key "internal_network" is supplied
    cloud_keywargs = dict((k, module.params[k]) for k in module.params
                          if k != 'internal_network')
    if internal_network:
        cloud_keywargs["networks"] = [
            dict(name=internal_network, routes_externally=False)
        ]
    cloud = shade.openstack_cloud(**cloud_keywargs)

    try:
        server = cloud.get_server(server_name_or_id)
        if server is None:
            module.fail_json(
                msg="server {0} not found".format(server_name_or_id))

        if state == 'present':
            # This part was added to support 'internal_network_name'
            # as in Ansible 1.9.x. This entire file should be removed
            # after this option added to Ansible 2.x
            if internal_network:
                internal_net_info = cloud.list_networks(
                    {'name': internal_network})
                internal_network_id = internal_net_info[0]['id']
                port_filter = {'device_id': server['id']}
                port_filter['network_id'] = internal_network_id
                ports = cloud.search_ports(filters=port_filter)
                port = ports[0]
                for address in port.get('fixed_ips', list()):
                    try:
                        ip = ipaddress.ip_address(address['ip_address'])
                    except Exception:
                        continue
                    if ip.version == 4:
                        fixed_address = address['ip_address']
                        break

            # If f_ip already assigned to server, check that it matches
            # requirements.
            f_ip = cloud.get_server_public_ip(server)
            f_ip = _get_floating_ip(cloud, f_ip) if f_ip else f_ip
            if f_ip:
                if network:
                    network_id = cloud.get_network(name_or_id=network)["id"]
                else:
                    network_id = None
                if all([
                        fixed_address, f_ip.fixed_ip_address == fixed_address,
                        network, f_ip.network != network_id
                ]):
                    # Current state definitely conflicts with requirements
                    module.fail_json(
                        msg="server {server} already has a "
                        "floating-ip on requested "
                        "interface but it doesn't match "
                        "requested network {network: {fip}".format(
                            server=server_name_or_id,
                            network=network,
                            fip=remove_values(f_ip, module.no_log_values)))
                if not network or f_ip.network == network_id:
                    # Requirements are met
                    module.exit_json(changed=False, floating_ip=f_ip)

                # Requirments are vague enough to ignore exisitng f_ip and try
                # to create a new f_ip to the server.

            server = cloud.add_ips_to_server(server=server,
                                             ips=floating_ip_address,
                                             ip_pool=network,
                                             reuse=reuse,
                                             fixed_address=fixed_address,
                                             wait=wait,
                                             timeout=timeout)
            fip_address = cloud.get_server_public_ip(server)
            # Update the floating IP status
            f_ip = _get_floating_ip(cloud, fip_address)
            module.exit_json(changed=True, floating_ip=f_ip)

        elif state == 'absent':
            if floating_ip_address is None:
                if not server_name_or_id:
                    module.fail_json(
                        msg="either server or floating_ip_address are required"
                    )
                server = cloud.get_server(server_name_or_id)
                floating_ip_address = cloud.get_server_public_ip(server)

            f_ip = _get_floating_ip(cloud, floating_ip_address)

            if not f_ip:
                # Nothing to detach
                module.exit_json(changed=False)
            changed = False
            if f_ip["fixed_ip_address"]:
                cloud.detach_ip_from_server(server_id=server['id'],
                                            floating_ip_id=f_ip['id'])
                # Update the floating IP status
                f_ip = cloud.get_floating_ip(id=f_ip['id'])
                changed = True
            if purge:
                cloud.delete_floating_ip(f_ip['id'])
                module.exit_json(changed=True)
            module.exit_json(changed=changed, floating_ip=f_ip)

    except shade.OpenStackCloudException as e:
        module.fail_json(msg=str(e), extra_data=e.extra_data)
Пример #45
0
import shade

cloud = shade.openstack_cloud(cloud='envvars')

print("\nListando imagens...")
images = cloud.list_images()
for image in images:
    print(image.id + '\t' + image.name)

print("\nListando sabores...")
flavors = cloud.list_flavors()
for flavor in flavors:
    print("{}\t{} vcpus \t{} MB  \t{}".format(flavor.id, flavor.vcpus,
                                              flavor.ram, flavor.name))
Пример #46
0
def main():
    argument_spec = openstack_full_argument_spec(
        name=dict(required=True),
        shared=dict(default=False, type='bool'),
        admin_state_up=dict(default=True, type='bool'),
        external=dict(default=False, type='bool'),
        provider_physical_network=dict(required=False),
        provider_network_type=dict(required=False,
                                   default=None,
                                   choices=['flat', 'vlan', 'vxlan', 'gre']),
        provider_segmentation_id=dict(required=False),
        state=dict(default='present', choices=['absent', 'present']),
    )

    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(argument_spec, **module_kwargs)

    if not HAS_SHADE:
        module.fail_json(msg='shade is required for this module')

    state = module.params['state']
    name = module.params['name']
    shared = module.params['shared']
    admin_state_up = module.params['admin_state_up']
    external = module.params['external']
    provider_physical_network = module.params['provider_physical_network']
    provider_network_type = module.params['provider_network_type']
    provider_segmentation_id = module.params['provider_segmentation_id']

    try:
        cloud = shade.openstack_cloud(**module.params)
        net = cloud.get_network(name)

        if state == 'present':
            if not net:
                provider = {}
                if provider_physical_network:
                    provider['physical_network'] = provider_physical_network
                if provider_network_type:
                    provider['network_type'] = provider_network_type
                if provider_segmentation_id:
                    provider['segmentation_id'] = provider_segmentation_id

                if provider and StrictVersion(
                        shade.__version__) < StrictVersion('1.5.0'):
                    module.fail_json(
                        msg="Shade >= 1.5.0 required to use provider options")

                net = cloud.create_network(name, shared, admin_state_up,
                                           external, provider)
                changed = True
            else:
                changed = False
            module.exit_json(changed=changed, network=net, id=net['id'])

        elif state == 'absent':
            if not net:
                module.exit_json(changed=False)
            else:
                cloud.delete_network(name)
                module.exit_json(changed=True)

    except shade.OpenStackCloudException as e:
        module.fail_json(msg=str(e))
 def __init__(self, scheme):
     self.cloud = shade.openstack_cloud()
     self._scheme = scheme
def main():
    argument_spec = openstack_full_argument_spec(
        server=dict(required=True),
        action=dict(required=True,
                    choices=[
                        'stop', 'start', 'pause', 'unpause', 'lock', 'unlock',
                        'suspend', 'resume', 'rebuild'
                    ]),
        image=dict(required=False),
    )

    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(argument_spec,
                           supports_check_mode=True,
                           required_if=[('action', 'rebuild', ['image'])],
                           **module_kwargs)

    if not HAS_SHADE:
        module.fail_json(msg='shade is required for this module')

    action = module.params['action']
    wait = module.params['wait']
    timeout = module.params['timeout']
    image = module.params['image']

    try:
        if action in _admin_actions:
            cloud = shade.operator_cloud(**module.params)
        else:
            cloud = shade.openstack_cloud(**module.params)
        server = cloud.get_server(module.params['server'])
        if not server:
            module.fail_json(msg='Could not find server %s' % server)
        status = server.status

        if module.check_mode:
            module.exit_json(changed=_system_state_change(action, status))

        if action == 'stop':
            if not _system_state_change(action, status):
                module.exit_json(changed=False)

            cloud.nova_client.servers.stop(server=server.id)
            if wait:
                _wait(timeout, cloud, server, action)
                module.exit_json(changed=True)

        if action == 'start':
            if not _system_state_change(action, status):
                module.exit_json(changed=False)

            cloud.nova_client.servers.start(server=server.id)
            if wait:
                _wait(timeout, cloud, server, action)
                module.exit_json(changed=True)

        if action == 'pause':
            if not _system_state_change(action, status):
                module.exit_json(changed=False)

            cloud.nova_client.servers.pause(server=server.id)
            if wait:
                _wait(timeout, cloud, server, action)
                module.exit_json(changed=True)

        elif action == 'unpause':
            if not _system_state_change(action, status):
                module.exit_json(changed=False)

            cloud.nova_client.servers.unpause(server=server.id)
            if wait:
                _wait(timeout, cloud, server, action)
            module.exit_json(changed=True)

        elif action == 'lock':
            # lock doesn't set a state, just do it
            cloud.nova_client.servers.lock(server=server.id)
            module.exit_json(changed=True)

        elif action == 'unlock':
            # unlock doesn't set a state, just do it
            cloud.nova_client.servers.unlock(server=server.id)
            module.exit_json(changed=True)

        elif action == 'suspend':
            if not _system_state_change(action, status):
                module.exit_json(changed=False)

            cloud.nova_client.servers.suspend(server=server.id)
            if wait:
                _wait(timeout, cloud, server, action)
            module.exit_json(changed=True)

        elif action == 'resume':
            if not _system_state_change(action, status):
                module.exit_json(changed=False)

            cloud.nova_client.servers.resume(server=server.id)
            if wait:
                _wait(timeout, cloud, server, action)
            module.exit_json(changed=True)

        elif action == 'rebuild':
            image = cloud.get_image(image)

            if image is None:
                module.fail_json(msg="Image does not exist")

            # rebuild doesn't set a state, just do it
            cloud.nova_client.servers.rebuild(server=server.id, image=image.id)
            if wait:
                _wait(timeout, cloud, server, action)
            module.exit_json(changed=True)

    except shade.OpenStackCloudException as e:
        module.fail_json(msg=str(e), extra_data=e.extra_data)
Пример #49
0
def build_inventory():
    '''Build the dynamic inventory.'''
    cloud = shade.openstack_cloud()

    # Use an environment variable to optionally skip returning the app nodes.
    show_compute_nodes = os.environ.get('OPENSTACK_SHOW_COMPUTE_NODES',
                                        'true').lower() == "true"

    # If `OPENSHIFT_CLUSTER` env variable is defined then it's used to
    # filter servers by metadata.clusterid attribute value.
    cluster_hosts = [
        server for server in cloud.list_servers()
        if 'clusterid' in server.get('metadata', []) and (
            OPENSHIFT_CLUSTER is None
            or server.metadata.clusterid == OPENSHIFT_CLUSTER) and
        (show_compute_nodes or server.metadata.get('sub-host-type') != 'app')
    ]

    inventory = base_openshift_inventory(cluster_hosts)

    inventory['_meta'] = {'hostvars': {}}

    # Some clouds don't have Cinder. That's okay:
    try:
        volumes = cloud.list_volumes()
    except EndpointNotFound:
        volumes = []

    # cinder volumes used for docker storage
    docker_storage_mountpoints = get_docker_storage_mountpoints(volumes)
    for server in cluster_hosts:
        inventory['_meta']['hostvars'][server.name] = _get_hostvars(
            server, docker_storage_mountpoints)

    stout = _get_stack_outputs(cloud)
    if stout is not None:
        try:
            inventory['localhost'].update({
                'openshift_openstack_api_lb_provider':
                stout['api_lb_provider'],
                'openshift_openstack_api_lb_port_id':
                stout['api_lb_vip_port_id'],
                'openshift_openstack_api_lb_sg_id':
                stout['api_lb_sg_id']
            })
        except KeyError:
            pass  # Not an API load balanced deployment

        try:
            inventory['OSEv3']['vars'][
                'openshift_master_cluster_hostname'] = stout['private_api_ip']
        except KeyError:
            pass  # Internal LB not specified

        inventory['localhost']['openshift_openstack_private_api_ip'] = \
            stout.get('private_api_ip')
        inventory['localhost']['openshift_openstack_public_api_ip'] = \
            stout.get('public_api_ip')
        inventory['localhost']['openshift_openstack_public_router_ip'] = \
            stout.get('public_router_ip')

        try:
            inventory['OSEv3']['vars'] = _get_kuryr_vars(cloud, stout)
        except KeyError:
            pass  # Not a kuryr deployment
    return inventory
Пример #50
0
 def setUp(self):
     super(TestMagnumServices, self).setUp()
     self.cloud = shade.openstack_cloud(validate=False)
Пример #51
0
# Modify these values below (or read them in from the command line)

cloud_names = ['indiana', 'tacc', 'marana']
server_name_pattern = 'demo_worker-{}'

for cloud_name in cloud_names:
    print('Finding & deleting servers and keypairs in cloud: {}'.format(
        cloud_name))
    server_search_pattern = server_name_pattern.format('*')

    # Initialize. Set debug=True & http_debug=True if you want to see more detailed cloud activity
    shade.simple_logging(debug=False, http_debug=False)
    # shade.simple_logging(debug=True, http_debug=True)

    # Initialize cloud
    cloud = shade.openstack_cloud(cloud=cloud_name)

    # Find all servers matching a pattern
    for server in cloud.search_servers(server_search_pattern):
        # print(server.__dict__)
        print('Deleting {}...'.format(server.name))
        delete_result = cloud.delete_server(server, wait=True, delete_ips=True)
        print(delete_result)
    else:
        print('No servers found')

    # Delete keypair
    key_name = 'shade-key'
    keypair = cloud.get_keypair(key_name)
    if keypair:
        print('Deleting keypair {}...'.format(keypair.name))
Пример #52
0
def main():
    argument_spec = openstack_full_argument_spec(
        network=dict(required=False),
        name=dict(required=False),
        fixed_ips=dict(type='list', default=None),
        admin_state_up=dict(type='bool', default=None),
        mac_address=dict(default=None),
        security_groups=dict(default=None, type='list'),
        no_security_groups=dict(default=False, type='bool'),
        allowed_address_pairs=dict(type='list', default=None),
        extra_dhcp_opts=dict(type='list', default=None),
        device_owner=dict(default=None),
        device_id=dict(default=None),
        state=dict(default='present', choices=['absent', 'present']),
    )

    module_kwargs = openstack_module_kwargs(mutually_exclusive=[
        ['no_security_groups', 'security_groups'],
    ])

    module = AnsibleModule(argument_spec,
                           supports_check_mode=True,
                           **module_kwargs)

    if not HAS_SHADE:
        module.fail_json(msg='shade is required for this module')
    name = module.params['name']
    state = module.params['state']

    try:
        cloud = shade.openstack_cloud(**module.params)
        if module.params['security_groups']:
            # translate security_groups to UUID's if names where provided
            module.params['security_groups'] = [
                get_security_group_id(module, cloud, v)
                for v in module.params['security_groups']
            ]

        port = None
        network_id = None
        if name:
            port = cloud.get_port(name)

        if module.check_mode:
            module.exit_json(changed=_system_state_change(module, port, cloud))

        changed = False
        if state == 'present':
            if not port:
                network = module.params['network']
                if not network:
                    module.fail_json(
                        msg="Parameter 'network' is required in Port Create")
                port_kwargs = _compose_port_args(module, cloud)
                network_object = cloud.get_network(network)

                if network_object:
                    network_id = network_object['id']
                else:
                    module.fail_json(msg="Specified network was not found.")

                port = cloud.create_port(network_id, **port_kwargs)
                changed = True
            else:
                if _needs_update(module, port, cloud):
                    port_kwargs = _compose_port_args(module, cloud)
                    port = cloud.update_port(port['id'], **port_kwargs)
                    changed = True
            module.exit_json(changed=changed, id=port['id'], port=port)

        if state == 'absent':
            if port:
                cloud.delete_port(port['id'])
                changed = True
            module.exit_json(changed=changed)

    except shade.OpenStackCloudException as e:
        module.fail_json(msg=str(e))
Пример #53
0
#!/usr/bin/env python
# Copyright (c) 2016 IBM Corp.
#
# 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.

import shade

for cloud in ('osic-cloud1', 'bluebox-sjc1'):
    cloud = shade.openstack_cloud(cloud=cloud)
    cleaned = [cloud.delete_floating_ip(ip.id) for ip in
               cloud.list_floating_ips() if ip.attached is False]
    print("Cleaned {num} FIPs from {cloud}".format(
        num=len(cleaned), cloud=cloud.name))
Пример #54
0
def default_ovn_provider_client(openstack_client_config):
    """
    Returns a shade connection configured to connect
    to the default ovn provider.
    """
    return shade.openstack_cloud(cloud=openstack_client_config)
Пример #55
0
 def test_get_server_ip(self):
     srv = meta.obj_to_dict(FakeServer())
     cloud = shade.openstack_cloud(validate=False)
     self.assertEqual(PRIVATE_V4, meta.get_server_private_ip(srv, cloud))
     self.assertEqual(PUBLIC_V4, meta.get_server_external_ipv4(cloud, srv))
Пример #56
0
def main():
    ipv6_mode_choices = ['dhcpv6-stateful', 'dhcpv6-stateless', 'slaac']
    argument_spec = openstack_full_argument_spec(
        name=dict(required=True),
        network_name=dict(default=None),
        cidr=dict(default=None),
        ip_version=dict(default='4', choices=['4', '6']),
        enable_dhcp=dict(default='true', type='bool'),
        gateway_ip=dict(default=None),
        dns_nameservers=dict(default=None, type='list'),
        allocation_pool_start=dict(default=None),
        allocation_pool_end=dict(default=None),
        host_routes=dict(default=None, type='list'),
        ipv6_ra_mode=dict(default=None, choice=ipv6_mode_choices),
        ipv6_address_mode=dict(default=None, choice=ipv6_mode_choices),
        state=dict(default='present', choices=['absent', 'present']),
        project=dict(default=None))

    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(argument_spec,
                           supports_check_mode=True,
                           **module_kwargs)

    if not HAS_SHADE:
        module.fail_json(msg='shade is required for this module')

    state = module.params['state']
    network_name = module.params['network_name']
    cidr = module.params['cidr']
    ip_version = module.params['ip_version']
    enable_dhcp = module.params['enable_dhcp']
    subnet_name = module.params['name']
    gateway_ip = module.params['gateway_ip']
    dns = module.params['dns_nameservers']
    pool_start = module.params['allocation_pool_start']
    pool_end = module.params['allocation_pool_end']
    host_routes = module.params['host_routes']
    ipv6_ra_mode = module.params['ipv6_ra_mode']
    ipv6_a_mode = module.params['ipv6_address_mode']
    project = module.params.pop('project')

    # Check for required parameters when state == 'present'
    if state == 'present':
        for p in ['network_name', 'cidr']:
            if not module.params[p]:
                module.fail_json(msg='%s required with present state' % p)

    if pool_start and pool_end:
        pool = [dict(start=pool_start, end=pool_end)]
    elif pool_start or pool_end:
        module.fail_json(msg='allocation pool requires start and end values')
    else:
        pool = None

    try:
        cloud = shade.openstack_cloud(**module.params)
        if project is not None:
            proj = cloud.get_project(project)
            if proj is None:
                module.fail_json(msg='Project %s could not be found' % project)
            project_id = proj['id']
            filters = {'tenant_id': project_id}
        else:
            project_id = None
            filters = None

        subnet = cloud.get_subnet(subnet_name, filters=filters)

        if module.check_mode:
            module.exit_json(
                changed=_system_state_change(module, subnet, cloud))

        if state == 'present':
            if not subnet:
                subnet = cloud.create_subnet(network_name,
                                             cidr,
                                             ip_version=ip_version,
                                             enable_dhcp=enable_dhcp,
                                             subnet_name=subnet_name,
                                             gateway_ip=gateway_ip,
                                             dns_nameservers=dns,
                                             allocation_pools=pool,
                                             host_routes=host_routes,
                                             ipv6_ra_mode=ipv6_ra_mode,
                                             ipv6_address_mode=ipv6_a_mode,
                                             tenant_id=project_id)
                changed = True
            else:
                if _needs_update(subnet, module, cloud):
                    cloud.update_subnet(subnet['id'],
                                        subnet_name=subnet_name,
                                        enable_dhcp=enable_dhcp,
                                        gateway_ip=gateway_ip,
                                        dns_nameservers=dns,
                                        allocation_pools=pool,
                                        host_routes=host_routes)
                    changed = True
                else:
                    changed = False
            module.exit_json(changed=changed, subnet=subnet, id=subnet['id'])

        elif state == 'absent':
            if not subnet:
                changed = False
            else:
                changed = True
                cloud.delete_subnet(subnet_name)
            module.exit_json(changed=changed)

    except shade.OpenStackCloudException as e:
        module.fail_json(msg=str(e))
Пример #57
0
def build_inventory():
    '''Build the dynamic inventory.'''
    cloud = shade.openstack_cloud()

    # TODO(shadower): filter the servers based on the `OPENSHIFT_CLUSTER`
    # environment variable.
    cluster_hosts = [
        server for server in cloud.list_servers()
        if 'metadata' in server and 'clusterid' in server.metadata
    ]

    inventory = base_openshift_inventory(cluster_hosts)

    for server in cluster_hosts:
        if 'group' in server.metadata:
            group = server.metadata.get('group')
            if group not in inventory:
                inventory[group] = {'hosts': []}
            inventory[group]['hosts'].append(server.name)

    inventory['_meta'] = {'hostvars': {}}

    # Some clouds don't have Cinder. That's okay:
    try:
        volumes = cloud.list_volumes()
    except EndpointNotFound:
        volumes = []

    # cinder volumes used for docker storage
    docker_storage_mountpoints = get_docker_storage_mountpoints(volumes)
    for server in cluster_hosts:
        inventory['_meta']['hostvars'][server.name] = _get_hostvars(
            server, docker_storage_mountpoints)

    stout = _get_stack_outputs(cloud)
    if stout is not None:
        try:
            inventory['localhost'].update({
                'openshift_openstack_api_lb_provider':
                stout['api_lb_provider'],
                'openshift_openstack_api_lb_port_id':
                stout['api_lb_vip_port_id'],
                'openshift_openstack_api_lb_sg_id':
                stout['api_lb_sg_id']
            })
        except KeyError:
            pass  # Not an API load balanced deployment

        try:
            inventory['OSEv3']['vars'][
                'openshift_master_cluster_hostname'] = stout['private_api_ip']
        except KeyError:
            pass  # Internal LB not specified

        inventory['localhost']['openshift_openstack_public_api_ip'] = \
            stout.get('public_api_ip')
        inventory['localhost']['openshift_openstack_public_router_ip'] = \
            stout.get('public_router_ip')

        try:
            inventory['OSEv3']['vars'] = _get_kuryr_vars(cloud, stout)
        except KeyError:
            pass  # Not a kuryr deployment
    return inventory
Пример #58
0
def main():

    argument_spec = openstack_full_argument_spec(
        name=dict(required=True),
        disk_format=dict(default='qcow2',
                         choices=[
                             'ami', 'ari', 'aki', 'vhd', 'vmdk', 'raw',
                             'qcow2', 'vdi', 'iso', 'vhdx', 'ploop'
                         ]),
        container_format=dict(
            default='bare',
            choices=['ami', 'aki', 'ari', 'bare', 'ovf', 'ova', 'docker']),
        owner=dict(default=None),
        min_disk=dict(type='int', default=0),
        min_ram=dict(type='int', default=0),
        is_public=dict(type='bool', default=False),
        filename=dict(default=None),
        ramdisk=dict(default=None),
        kernel=dict(default=None),
        properties=dict(type='dict', default={}),
        state=dict(default='present', choices=['absent', 'present']),
    )
    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(argument_spec, **module_kwargs)

    if not HAS_SHADE:
        module.fail_json(msg='shade is required for this module')

    try:
        cloud = shade.openstack_cloud(**module.params)

        changed = False
        image = cloud.get_image(name_or_id=module.params['name'])

        if module.params['state'] == 'present':
            if not image:
                image = cloud.create_image(
                    name=module.params['name'],
                    filename=module.params['filename'],
                    disk_format=module.params['disk_format'],
                    container_format=module.params['container_format'],
                    wait=module.params['wait'],
                    timeout=module.params['timeout'],
                    is_public=module.params['is_public'],
                    min_disk=module.params['min_disk'],
                    min_ram=module.params['min_ram'])
                changed = True
                if not module.params['wait']:
                    module.exit_json(changed=changed, image=image, id=image.id)

            cloud.update_image_properties(image=image,
                                          kernel=module.params['kernel'],
                                          ramdisk=module.params['ramdisk'],
                                          **module.params['properties'])
            image = cloud.get_image(name_or_id=image.id)
            module.exit_json(changed=changed, image=image, id=image.id)

        elif module.params['state'] == 'absent':
            if not image:
                changed = False
            else:
                cloud.delete_image(name_or_id=module.params['name'],
                                   wait=module.params['wait'],
                                   timeout=module.params['timeout'])
                changed = True
            module.exit_json(changed=changed)

    except shade.OpenStackCloudException as e:
        module.fail_json(msg=str(e), extra_data=e.extra_data)
Пример #59
0
def main():

    argument_spec = openstack_full_argument_spec(
        name=dict(required=True),
        image=dict(default=None),
        image_exclude=dict(default='(deprecated)'),
        flavor=dict(default=None),
        flavor_ram=dict(default=None, type='int'),
        flavor_include=dict(default=None),
        key_name=dict(default=None),
        security_groups=dict(default=['default'], type='list'),
        network=dict(default=None),
        nics=dict(default=[], type='list'),
        meta=dict(default=None),
        userdata=dict(default=None, aliases=['user_data']),
        config_drive=dict(default=False, type='bool'),
        auto_ip=dict(default=True,
                     type='bool',
                     aliases=['auto_floating_ip', 'public_ip']),
        floating_ips=dict(default=None),
        floating_ip_pools=dict(default=None),
        volume_size=dict(default=False, type='int'),
        boot_from_volume=dict(default=False, type='bool'),
        boot_volume=dict(default=None, aliases=['root_volume']),
        terminate_volume=dict(default=False, type='bool'),
        volumes=dict(default=[], type='list'),
        state=dict(default='present', choices=['absent', 'present']),
    )
    module_kwargs = openstack_module_kwargs(
        mutually_exclusive=[
            ['auto_ip', 'floating_ips'],
            ['auto_ip', 'floating_ip_pools'],
            ['floating_ips', 'floating_ip_pools'],
            ['flavor', 'flavor_ram'],
            ['image', 'boot_volume'],
            ['boot_from_volume', 'boot_volume'],
            ['nics', 'network'],
        ],
        required_if=[
            ('boot_from_volume', True, ['volume_size', 'image']),
        ],
    )
    module = AnsibleModule(argument_spec, **module_kwargs)

    if not HAS_SHADE:
        module.fail_json(msg='shade is required for this module')

    state = module.params['state']
    image = module.params['image']
    boot_volume = module.params['boot_volume']
    flavor = module.params['flavor']
    flavor_ram = module.params['flavor_ram']

    if state == 'present':
        if not (image or boot_volume):
            module.fail_json(
                msg="Parameter 'image' or 'boot_volume' is required "
                "if state == 'present'")
        if not flavor and not flavor_ram:
            module.fail_json(
                msg="Parameter 'flavor' or 'flavor_ram' is required "
                "if state == 'present'")

    try:
        cloud_params = dict(module.params)
        cloud_params.pop('userdata', None)
        cloud = shade.openstack_cloud(**cloud_params)

        if state == 'present':
            _get_server_state(module, cloud)
            _create_server(module, cloud)
        elif state == 'absent':
            _get_server_state(module, cloud)
            _delete_server(module, cloud)
    except shade.OpenStackCloudException as e:
        module.fail_json(msg=str(e), extra_data=e.extra_data)
Пример #60
0
def main():
    argument_spec = openstack_full_argument_spec(
        server=dict(required=True),
        state=dict(default='present', choices=['absent', 'present']),
        network=dict(required=False, default=None),
        floating_ip_address=dict(required=False, default=None),
        reuse=dict(required=False, type='bool', default=False),
        fixed_address=dict(required=False, default=None),
        nat_destination=dict(required=False, default=None,
                             aliases=['fixed_network', 'internal_network']),
        wait=dict(required=False, type='bool', default=False),
        timeout=dict(required=False, type='int', default=60),
        purge=dict(required=False, type='bool', default=False),
    )

    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(argument_spec, **module_kwargs)

    if not HAS_SHADE:
        module.fail_json(msg='shade is required for this module')

    if (module.params['nat_destination'] and
            StrictVersion(shade.__version__) < StrictVersion('1.8.0')):
        module.fail_json(msg="To utilize nat_destination, the installed version of"
                             "the shade library MUST be >= 1.8.0")

    server_name_or_id = module.params['server']
    state = module.params['state']
    network = module.params['network']
    floating_ip_address = module.params['floating_ip_address']
    reuse = module.params['reuse']
    fixed_address = module.params['fixed_address']
    nat_destination = module.params['nat_destination']
    wait = module.params['wait']
    timeout = module.params['timeout']
    purge = module.params['purge']

    cloud = shade.openstack_cloud(**module.params)

    try:
        server = cloud.get_server(server_name_or_id)
        if server is None:
            module.fail_json(
                msg="server {0} not found".format(server_name_or_id))

        if state == 'present':
            # If f_ip already assigned to server, check that it matches
            # requirements.
            public_ip = cloud.get_server_public_ip(server)
            f_ip = _get_floating_ip(cloud, public_ip) if public_ip else public_ip
            if f_ip:
                if network:
                    network_id = cloud.get_network(name_or_id=network)["id"]
                else:
                    network_id = None
                if all([(fixed_address and f_ip.fixed_ip_address == fixed_address) or
                        (nat_destination and f_ip.internal_network == fixed_address),
                        network, f_ip.network != network_id]):
                    # Current state definitely conflicts with requirements
                    module.fail_json(msg="server {server} already has a "
                                         "floating-ip on requested "
                                         "interface but it doesn't match "
                                         "requested network {network: {fip}"
                                     .format(server=server_name_or_id,
                                             network=network,
                                             fip=remove_values(f_ip,
                                                               module.no_log_values)))
                if not network or f_ip.network == network_id:
                    # Requirements are met
                    module.exit_json(changed=False, floating_ip=f_ip)

                # Requirements are vague enough to ignore existing f_ip and try
                # to create a new f_ip to the server.

            server = cloud.add_ips_to_server(
                server=server, ips=floating_ip_address, ip_pool=network,
                reuse=reuse, fixed_address=fixed_address, wait=wait,
                timeout=timeout, nat_destination=nat_destination)
            fip_address = cloud.get_server_public_ip(server)
            # Update the floating IP status
            f_ip = _get_floating_ip(cloud, fip_address)
            module.exit_json(changed=True, floating_ip=f_ip)

        elif state == 'absent':
            if floating_ip_address is None:
                if not server_name_or_id:
                    module.fail_json(msg="either server or floating_ip_address are required")
                server = cloud.get_server(server_name_or_id)
                floating_ip_address = cloud.get_server_public_ip(server)

            f_ip = _get_floating_ip(cloud, floating_ip_address)

            if not f_ip:
                # Nothing to detach
                module.exit_json(changed=False)
            changed = False
            if f_ip["fixed_ip_address"]:
                cloud.detach_ip_from_server(
                    server_id=server['id'], floating_ip_id=f_ip['id'])
                # Update the floating IP status
                f_ip = cloud.get_floating_ip(id=f_ip['id'])
                changed = True
            if purge:
                cloud.delete_floating_ip(f_ip['id'])
                module.exit_json(changed=True)
            module.exit_json(changed=changed, floating_ip=f_ip)

    except shade.OpenStackCloudException as e:
        module.fail_json(msg=str(e), extra_data=e.extra_data)