Example #1
0
class CF_User(object):
    def __init__(self, module):
        self.module = module
        admin_user = self.module.params['admin_user']
        admin_password = self.module.params['admin_password']
        api_url = self.module.params['api_url']
        self.name = self.module.params['name']
        try:
            self.cf = CF(api_url)
            self.cf.login(admin_user, admin_password)
        except CFException as e:
            self.module.fail_json(msg=str(e))
        except Exception as e:
            self.module.fail_json(msg="Exception: %s" % str(e))

    def run(self):
        force = self.module.params['force']
        state = self.module.params['state']
        try:
            user = self.cf.search_user(self.name)
            if state == 'present':
                space_guid = None
                if self.module.params['default_organization'] is not None:
                    org = self.cf.search_org(
                        self.module.params['default_organization'])
                    if not org:
                        self.module.fail_json(msg='Organization not found')
                    org_guid = org['metadata']['guid']
                    space_name = self.module.params['default_space']
                    space = self.cf.search_space(org_guid, space_name)
                    if not space:
                        self.module.fail_json(msg='Space not found')
                    space_guid = space['metadata']['guid']
                result = self.present(user, space_guid, force)
            elif state == 'absent':
                result = self.absent(user, True)
            else:
                self.module.fail_json(msg='Invalid state: %s' % state)
        except CFException as e:
            self.module.fail_json(msg=str(e))
        except Exception as e:
            raise
            self.module.fail_json(msg="Exception: %s" % str(e))
        self.module.exit_json(**result)

    def absent(self, user, force, async=False):
        changed = False
        if user is not None:
            user_id = user['metadata']['guid']
            changed = True
            if not self.module.check_mode:
                try:
                    self.cf.delete_user(user_id, async, force)
                except CFException as e:
                    msg = 'Cannot delete user %s: %s' % (self.name, str(e))
                    self.module.fail_json(msg=msg)
        result = {'changed': changed, 'msg': "CF user %s deleted" % self.name}
        return result
class CF_Secgroup_rule(object):

    def __init__(self, module):
        self.module = module
        admin_user = self.module.params['admin_user']
        admin_password = self.module.params['admin_password']
        api_url = self.module.params['api_url']
        self.name = self.module.params['name']
        try:
            self.cf = CF(api_url)
            self.cf.login(admin_user, admin_password)
        except CFException as e:
            self.module.fail_json(msg=str(e))
        except Exception as e:
            self.module.fail_json(msg="Exception: %s" % str(e))
        self.secg_name = self.module.params['sec_group']

    def run(self):
        state = self.module.params['state']
        try:
            sec_group = self.cf.search_secgroup(self.secg_name)
            if not sec_group:
                self.module.fail_json(msg='Security group not found')
            mode = state == "present"
            sec_group_guid = sec_group['metadata']['guid']
            result = self.set_sec_group_rule(sec_group_guid, mode)
        except CFException as e:
            self.module.fail_json(msg=str(e))
        except Exception as e:
            self.module.fail_json(msg="Exception: %s" % str(e))
        self.module.exit_json(**result)

    def set_sec_group_rule(self, guid, mode):
        rule = {
            'description': self.name,
            'destination': self.module.params['destination'],
            'protocol': self.module.params['protocol'],
            'log': self.module.params['log']
        }
        if self.module.params['ports'] is not None:
            rule['ports'] = self.module.params['ports']
        if self.module.params['code'] is not None:
            rule['code'] = self.module.params['code']
        if self.module.params['type'] is not None:
            rule['type'] = self.module.params['type']
        sec_group = self.cf.manage_secgroup_rule(guid, rule, mode)
        changed = False
        msg = "CF security group %s rules not updated" % (self.name)
        if sec_group is not None:
            changed = True
            msg = "CF security group %s rules updated" % (self.name)
        result = {
            'changed': changed,
            'msg': msg,
            'data': sec_group
        }
        return result
Example #3
0
class CF_Space(object):

    def __init__(self, module):
        self.module = module
        admin_user = self.module.params['admin_user']
        admin_password = self.module.params['admin_password']
        api_url = self.module.params['api_url']
        self.name = self.module.params['name']
        try:
            self.cf = CF(api_url)
            self.cf.login(admin_user, admin_password)
        except CFException as e:
            self.module.fail_json(msg=str(e))
        except Exception as e:
            self.module.fail_json(msg="Exception: %s" % str(e))
        self.oname = self.module.params['organization']

    def run(self):
        state = self.module.params['state']
        try:
            org = self.cf.search_org(self.oname)
            if not org:
                msg = 'Organization %s not found' % self.oname
                self.module.fail_json(msg=msg)
            org_guid = org['metadata']['guid']
            space = self.cf.search_space(org_guid, self.name)
            if state == 'present':
                result = self.present(space, org_guid)
            elif state == 'absent':
                recursive = self.module.params['force']
                result = self.absent(space, org_guid, recursive)
            else:
                self.module.fail_json(msg='Invalid state: %s' % state)
        except CFException as e:
            self.module.fail_json(msg=str(e))
        except Exception as e:
            self.module.fail_json(msg="Exception: %s" % str(e))
        self.module.exit_json(**result)

    def absent(self, space, org_guid, recursive, async=False):
        changed = False
        if space is not None:
            space_guid = space['metadata']['guid']
            changed = True
            if not self.module.check_mode:
                try:
                    self.cf.delete_space(space_guid, async, recursive)
                except CFException as e:
                    msg = 'Cannot delete space %s: %s' % (self.name, str(e))
                    self.module.fail_json(msg=msg)
        result = {
            'changed': changed,
            'msg': "CF space %s deleted from %s org" % (self.name, self.oname)
        }
        return result
Example #4
0
class CF_Org(object):
    system_orgs = ['pivotal']

    def __init__(self, module):
        self.module = module
        admin_user = self.module.params['admin_user']
        admin_password = self.module.params['admin_password']
        api_url = self.module.params['api_url']
        self.name = self.module.params['name']
        try:
            self.cf = CF(api_url)
            self.cf.login(admin_user, admin_password)
        except CFException as e:
            self.module.fail_json(msg=str(e))
        except Exception as e:
            self.module.fail_json(msg="Exception: %s" % str(e))

    def run(self):
        force = self.module.params['force']
        state = self.module.params['state']
        try:
            org = self.cf.search_org(self.name)
            if state == 'present':
                quota_name = self.module.params['quota']
                result = self.present(org, quota_name)
            elif state == 'absent':
                if self.name in self.system_orgs and not force:
                    self.module.fail_json(msg="Cannot delete a system org")
                result = self.absent(org, force)
            else:
                self.module.fail_json(msg='Invalid state: %s' % state)
        except CFException as e:
            self.module.fail_json(msg=str(e))
        except Exception as e:
            self.module.fail_json(msg="Exception: %s" % str(e))
        self.module.exit_json(**result)

    def absent(self, org, recursive, async=False):
        changed = False
        if org is not None:
            org_guid = org['metadata']['guid']
            changed = True
            if not self.module.check_mode:
                try:
                    self.cf.delete_org(org_guid, async, recursive)
                except CFException as e:
                    msg = 'Cannot delete org %s: %s' % (self.name, str(e))
                    self.module.fail_json(msg=msg)
        result = {
            'changed': changed,
            'msg': "CF org %s deleted" % self.name
        }
        return result
class CF_Quota(object):
    system_quotas = ['default']

    def __init__(self, module):
        self.module = module
        admin_user = self.module.params['admin_user']
        admin_password = self.module.params['admin_password']
        api_url = self.module.params['api_url']
        self.name = self.module.params['name']
        try:
            self.cf = CF(api_url)
            self.cf.login(admin_user, admin_password)
        except CFException as e:
            self.module.fail_json(msg=str(e))
        except Exception as e:
            self.module.fail_json(msg="Exception: %s" % str(e))

    def run(self):
        force = self.module.params['force']
        state = self.module.params['state']
        try:
            quota = self.cf.search_quota(self.name)
            if state == 'present':
                result = self.present(quota)
            elif state == 'absent':
                if self.name in self.system_quotas and not force:
                    self.module.fail_json(
                        msg="Cannot delete system default quota")
                result = self.absent(quota)
            else:
                self.module.fail_json(msg='Invalid state: %s' % state)
        except CFException as e:
            self.module.fail_json(msg=str(e))
        except Exception as e:
            self.module.fail_json(msg="Exception: %s" % str(e))
        self.module.exit_json(**result)

    def absent(self, quota, async=False):
        changed = False
        if quota is not None:
            quota_guid = quota['metadata']['guid']
            changed = True
            if not self.module.check_mode:
                try:
                    self.cf.delete_quota(quota_guid, async)
                except CFException as e:
                    msg = 'Cannot delete quota %s: %s' % (self.name, str(e))
                    self.module.fail_json(msg=msg)
        result = {'changed': changed, 'msg': "CF quota %s deleted" % self.name}
        return result
def run(user, password, api, entity_filter, entity_fields=['name']):
    cf = CF(api)
    cf.login(user, password)
    result = cf.request('GET', "/v2/apps", {"results-per-page": 100})
    apps = result[0]
    print("* Total results: %s" % apps['total_results'])
    data = apps['resources']
    fun = "filter(lambda x: %s, data)" % entity_filter
    filtered = list(eval(fun))
    for entity in filtered:
      app = entity['entity']
      fields = [str(app[x]) if x in app else x for x in entity_fields]
      #print(app)
      print(" ".join(fields))
    print("* Apps: %d" % len(filtered))
Example #7
0
def run(user, password, api, entity_filter, entity_fields=['name']):
    cf = CF(api)
    cf.login(user, password)
    result = cf.request('GET', "/v2/apps", {"results-per-page": 100})
    apps = result[0]
    print("* Total results: %s" % apps['total_results'])
    data = apps['resources']
    fun = "filter(lambda x: %s, data)" % entity_filter
    filtered = list(eval(fun))
    for entity in filtered:
        app = entity['entity']
        fields = [str(app[x]) if x in app else x for x in entity_fields]
        #print(app)
        print(" ".join(fields))
    print("* Apps: %d" % len(filtered))
Example #8
0
def run_module():
    # define the available arguments/parameters that a user can pass to
    # the module
    module_args = dict(
        url=dict(type='str', required=True),
        username=dict(type='str', required=True),
        password=dict(type='str', required=True, no_log=True),
        org=dict(type='str', required=True),
        space=dict(type='str', required=True),
    )

    # seed the result dict in the object
    # we primarily care about changed and state
    # change is if this module effectively modified the target
    # state will include any data that you want your module to pass back
    # for consumption, for example, in a subsequent task
    result = dict(changed=False, status=True, apps=[], apps_info=[])

    # the AnsibleModule object will be our abstraction working with Ansible
    # this includes instantiation, a couple of common attr would be the
    # args/params passed to the execution, as well as if the module
    # supports check mode
    module = AnsibleModule(argument_spec=module_args, supports_check_mode=True)

    # log in to CF
    cf = CF(module.params['url'])
    logging.debug("Logging in")
    cf.login(module.params['username'], module.params['password'])

    # find org/space information
    cf_org_guid = get_org_guid(cf, module.params['org'])
    cf_space_guid = get_space_guid(cf, cf_org_guid, module.params['space'])

    # request the list of apps in the org/space
    apps = get_apps_info(cf, cf_org_guid, cf_space_guid)
    logging.debug("apps = '\n" + json.dumps(apps, indent=4) + "'")

    result['apps_info'] = apps

    for app in apps:
        result['apps'].append(app['name'])

    # in the event of a successful module execution, you will want to
    # simple AnsibleModule.exit_json(), passing the key/value results
    module.exit_json(**result)
Example #9
0
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from cfconfigurator.cf import CF

api_url = "https://api.test.cf.springer-sbm.com"
admin_user = "******"
admin_password = "******"

cf = CF(api_url)
cf.login(admin_user, admin_password)

org = cf.search_org("pivotal")
print(org)

services = cf.request('GET', "/v2/services", {"results-per-page": 1})
print(services)

services = cf.request('GET',
                      "https://api.test.cf.springer-sbm.com/v2/services",
                      {"results-per-page": 1})
print(services)
class CF_Config(object):

    def __init__(self, module):
        self.module = module
        admin_user = self.module.params['admin_user']
        admin_password = self.module.params['admin_password']
        api_url = self.module.params['api_url']
        self.name = self.module.params['name']
        try:
            self.cf = CF(api_url)
            self.cf.login(admin_user, admin_password)
        except CFException as e:
            self.module.fail_json(msg=str(e))
        except Exception as e:
            self.module.fail_json(msg="Exception: %s" % str(e))

    def run(self):
        state = self.module.params['state']
        config_type = self.module.params['type']
        mode = True if state == "present" else False
        try:
            if config_type == "feature_flag":
                if self.module.params['value'] is not None:
                    mode = self.module.boolean(self.module.params['value'])
                result = self.set_flag(mode)
            elif config_type == "env_var":
                if self.module.params['value'] is None:
                    self.module.fail_json(msg="No value for env var %s" % self.name)
                result = self.set_env(mode)
            elif config_type == "sec_group":
                result = self.set_sec_group(mode)
            else:
                self.module.fail_json(msg='Invalid type: %s' % config_type)
        except CFException as e:
            self.module.fail_json(msg=str(e))
        except Exception as e:
            self.module.fail_json(msg="Exception: %s" % str(e))
        self.module.exit_json(**result)

    def set_flag(self, status):
        flags = self.cf.get_feature_flags()
        for f in flags:
            if f['name'] == self.name:
                break
        else:
            msg = 'Feature flag not found: %s' % (self.name)
            self.module.fail_json(msg=msg)
        changed = self.cf.manage_feature_flags(self.name, status)
        result = {
            'changed': changed,
            'msg': "CF feature flag %s: %s" % (self.name, status)
        }
        return result

    def set_env(self, add):
        context = self.module.params['context']
        value = self.module.params['value']
        changed = self.cf.manage_variable_group(self.name, value, context, add)
        result = {
            'changed': changed,
            'msg': "CF environment variable group %s: %s" % (self.name, value)
        }
        return result

    def set_sec_group(self, add):
        sec_group = self.cf.search_secgroup(self.name)
        if sec_group is None:
            self.module.fail_json(msg="Security group %s not found" % self.name)
        sec_group_guid = sec_group['metadata']['guid']
        context = self.module.params['context']
        changed = self.cf.manage_secgroup_defaults(sec_group_guid, context, add)
        result = {
            'changed': changed,
            'msg': "CF sec group %s default %s group: %s" % (self.name, context, changed)
        }
        return result
class CF_Secgroup(object):

    def __init__(self, module):
        self.module = module
        admin_user = self.module.params['admin_user']
        admin_password = self.module.params['admin_password']
        api_url = self.module.params['api_url']
        self.name = self.module.params['name']
        try:
            self.cf = CF(api_url)
            self.cf.login(admin_user, admin_password)
        except CFException as e:
            self.module.fail_json(msg=str(e))
        except Exception as e:
            self.module.fail_json(msg="Exception: %s" % str(e))

    def run(self):
        state = self.module.params['state']
        try:
            sec_group = self.cf.search_secgroup(self.name)
            if state == 'present':
                space_state = self.module.params['space_state']
                mode = True if space_state == "present" else False
                space_guid = None
                if self.module.params['organization'] is not None:
                    org = self.cf.search_org(self.module.params['organization'])
                    if not org:
                        self.module.fail_json(msg='Organization not found')
                    org_guid = org['metadata']['guid']
                    space_name = self.module.params['space']
                    space = self.cf.search_space(org_guid, space_name)
                    if not space:
                        self.module.fail_json(msg='Space not found')
                    space_guid = space['metadata']['guid']
                result = self.present(sec_group, space_guid, mode)
            elif state == 'absent':
                result = self.absent(sec_group)
            else:
                self.module.fail_json(msg='Invalid state: %s' % state)
        except CFException as e:
            self.module.fail_json(msg=str(e))
        except Exception as e:
            self.module.fail_json(msg="Exception: %s" % str(e))
        self.module.exit_json(**result)

    def absent(self, sec_group, async=False):
        changed = False
        if sec_group is not None:
            sec_group_guid = sec_group['metadata']['guid']
            changed = True
            if not self.module.check_mode:
                try:
                    self.cf.delete_secgroup(sec_group_guid, async)
                except CFException as e:
                    msg = 'Cannot delete security group %s: %s' % (self.name, str(e))
                    self.module.fail_json(msg=msg)
        result = {
            'changed': changed,
            'msg': "CF security group %s deleted" % (self.name)
        }
        return result
class CF_Config(object):
    def __init__(self, module):
        self.module = module
        admin_user = self.module.params['admin_user']
        admin_password = self.module.params['admin_password']
        api_url = self.module.params['api_url']
        self.name = self.module.params['name']
        try:
            self.cf = CF(api_url)
            self.cf.login(admin_user, admin_password)
        except CFException as e:
            self.module.fail_json(msg=str(e))
        except Exception as e:
            self.module.fail_json(msg="Exception: %s" % str(e))

    def run(self):
        state = self.module.params['state']
        config_type = self.module.params['type']
        mode = True if state == "present" else False
        try:
            if config_type == "feature_flag":
                if self.module.params['value'] is not None:
                    mode = self.module.boolean(self.module.params['value'])
                result = self.set_flag(mode)
            elif config_type == "env_var":
                if self.module.params['value'] is None:
                    self.module.fail_json(msg="No value for env var %s" %
                                          self.name)
                result = self.set_env(mode)
            elif config_type == "sec_group":
                result = self.set_sec_group(mode)
            else:
                self.module.fail_json(msg='Invalid type: %s' % config_type)
        except CFException as e:
            self.module.fail_json(msg=str(e))
        except Exception as e:
            self.module.fail_json(msg="Exception: %s" % str(e))
        self.module.exit_json(**result)

    def set_flag(self, status):
        flags = self.cf.get_feature_flags()
        for f in flags:
            if f['name'] == self.name:
                break
        else:
            msg = 'Feature flag not found: %s' % (self.name)
            self.module.fail_json(msg=msg)
        changed = self.cf.manage_feature_flags(self.name, status)
        result = {
            'changed': changed,
            'msg': "CF feature flag %s: %s" % (self.name, status)
        }
        return result

    def set_env(self, add):
        context = self.module.params['context']
        value = self.module.params['value']
        changed = self.cf.manage_variable_group(self.name, value, context, add)
        result = {
            'changed': changed,
            'msg': "CF environment variable group %s: %s" % (self.name, value)
        }
        return result

    def set_sec_group(self, add):
        sec_group = self.cf.search_secgroup(self.name)
        if sec_group is None:
            self.module.fail_json(msg="Security group %s not found" %
                                  self.name)
        sec_group_guid = sec_group['metadata']['guid']
        context = self.module.params['context']
        changed = self.cf.manage_secgroup_defaults(sec_group_guid, context,
                                                   add)
        result = {
            'changed':
            changed,
            'msg':
            "CF sec group %s default %s group: %s" %
            (self.name, context, changed)
        }
        return result
Example #13
0
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from cfconfigurator.cf import CF

api_url = "https://api.test.cf.springer-sbm.com"
admin_user = "******"
admin_password = "******"

cf = CF(api_url)
cf.login(admin_user, admin_password)

org = cf.search_org("pivotal")
print(org)

services = cf.request('GET', "/v2/services", {"results-per-page": 1})
print(services)

services = cf.request('GET', "https://api.test.cf.springer-sbm.com/v2/services", {"results-per-page": 1})
print(services)

Example #14
0
class CF_Org_Facts(object):
    def __init__(self, module):
        self.module = module
        admin_user = self.module.params['admin_user']
        admin_password = self.module.params['admin_password']
        api_url = self.module.params['api_url']
        self.name = self.module.params['name']
        try:
            self.cf = CF(api_url)
            self.cf.login(admin_user, admin_password)
        except CFException as e:
            self.module.fail_json(msg=str(e))
        except Exception as e:
            self.module.fail_json(msg="Exception: %s" % str(e))

    def get_all_orgs(self):
        all_orgs = []
        # raise Exception(self.cf.api_url + '/v2/organizations')
        response, rcode = self.cf.request(
            'GET', self.cf.api_url + '/v2/organizations')
        # raise Exception(response)
        if rcode == 200:
            return [org['entity']['name'] for org in response['resources']]

    def get_quota(self, url):
        facts = {}
        quota, rcode = self.cf.request('GET', self.cf.api_url + url)
        if rcode == 200:
            facts['guid'] = quota['metadata']['guid']
            facts['created_at'] = quota['metadata']['created_at']
            facts['updated_at'] = quota['metadata']['updated_at']
            for key in quota['entity']:
                facts[key] = quota['entity'][key]
        return facts

    def get_private_domains(self, url, org_owner=None):
        owner_domains = []
        shared_domains = []
        domains, rcode = self.cf.request('GET', self.cf.api_url + url)
        if rcode == 200:
            for domain in domains['resources']:
                fact = {}
                fact['guid'] = domain['metadata']['guid']
                fact['created_at'] = domain['metadata']['created_at']
                fact['updated_at'] = domain['metadata']['updated_at']
                fact['name'] = domain['entity']['name']
                if org_id_owner is not None and domain['entity'][
                        'owning_organization_guid'] == org_owner:
                    owner_domains.append(fact)
                else:
                    shared_domains.append(fact)
        facts = {
            'owner_domains': owner_domains,
            'shared_domains': shared_domains
        }
        return facts

    def get_users(self, url):
        facts = []
        users, rcode = self.cf.request('GET', self.cf.api_url + url)
        if rcode == 200:
            for user in users['resources']:
                fact = {}
                fact['guid'] = user['metadata']['guid']
                fact['created_at'] = user['metadata']['created_at']
                fact['updated_at'] = user['metadata']['updated_at']
                fact['name'] = user['entity']['username']
                fact['admin'] = user['entity']['admin']
                fact['active'] = user['entity']['active']
                facts.append(fact)
        return facts

    def get_secgroups(self, url):
        facts = []
        secgroups, rcode = self.cf.request('GET', self.cf.api_url + url)
        if rcode == 200:
            for sg in secgroups['resources']:
                fact = {}
                fact['guid'] = sg['metadata']['guid']
                fact['created_at'] = sg['metadata']['created_at']
                fact['updated_at'] = sg['metadata']['updated_at']
                fact['name'] = sg['entity']['name']
                fact['running_default'] = sg['entity']['running_default']
                fact['staging_default'] = sg['entity']['staging_default']
                fact['rules'] = sg['entity']['rules']
                facts.append(fact)
        return facts

    def get_spaces(self,
                   url,
                   space_name=None,
                   users_type=['developers', 'managers', 'auditors']):
        facts = []
        spaces, rcode = self.cf.request('GET', self.cf.api_url + url)
        if rcode == 200:
            for space in spaces['resources']:
                if space_name is not None and space['entity'][
                        'name'] != space_name:
                    break
                fact = {}
                fact['guid'] = space['metadata']['guid']
                fact['created_at'] = space['metadata']['created_at']
                fact['updated_at'] = space['metadata']['updated_at']
                fact['name'] = space['entity']['name']
                fact['allow_ssh'] = space['entity']['allow_ssh']
                if 'quota_definition_url' in space['entity']:
                    fact['quota'] = self.get_quota(
                        space['entity']['quota_definition_url'])
                else:
                    fact['quota'] = {}
                fact['sec_groups'] = self.get_secgroups(
                    space['entity']['security_groups_url'])
                fact['users'] = {}
                for user_type in users_type:
                    if user_type not in fact['users']:
                        fact['users'][user_type] = []
                    user_url = user_type + '_url'
                    if user_url in space['entity']:
                        fact['users'][user_type] = self.get_users(
                            space['entity'][user_url])
                facts.append(fact)
        return facts

    def run(self):
        facts = {}
        try:
            space_name = self.module.params['space']
            if self.name is not None:
                org = self.cf.search_org(self.name)
                if org is not None:
                    if space_name is not None:
                        facts = self.get_spaces(org['entity']['spaces_url'],
                                                space_name)[0]
                    else:
                        facts['name'] = org['entity']['name']
                        facts['guid'] = org['metadata']['guid']
                        facts['status'] = org['entity']['status']
                        facts['created_at'] = org['metadata']['created_at']
                        facts['updated_at'] = org['metadata']['updated_at']
                        facts['spaces'] = self.get_spaces(
                            org['entity']['spaces_url'])
                        if 'quota_definition_url' in org['entity']:
                            facts['quota'] = self.get_quota(
                                org['entity']['quota_definition_url'])
                        else:
                            facts['quota'] = {}
                        facts['users'] = {}
                        for user_type in [
                                'users', 'managers', 'billing_managers',
                                'auditors'
                        ]:
                            if user_type not in facts['users']:
                                facts['users'][user_type] = []
                            user_url = user_type + '_url'
                            if user_url in org['entity']:
                                facts['users'][user_type] = self.get_users(
                                    org['entity'][user_url])
                        domains = self.get_private_domains(
                            org['entity']['private_domains_url'],
                            facts['guid'])
                        facts.update(domains)
            else:
                facts['orgs'] = self.get_all_orgs()
        except CFException as e:
            self.module.fail_json(msg=str(e))
        except Exception as e:
            self.module.fail_json(msg="Exception: %s" % str(e))
        result = {'ansible_facts': facts}
        self.module.exit_json(**result)
class CF_Domain(object):

    def __init__(self, module):
        self.module = module
        admin_user = self.module.params['admin_user']
        admin_password = self.module.params['admin_password']
        api_url = self.module.params['api_url']
        self.name = self.module.params['name']
        try:
            self.cf = CF(api_url)
            self.cf.login(admin_user, admin_password)
        except CFException as e:
            self.module.fail_json(msg=str(e))
        except Exception as e:
            self.module.fail_json(msg="Exception: %s" % str(e))
        self.kind = self.module.params['type']

    def run(self):
        state = self.module.params['state']
        try:
            domain = self.cf.search_domain(self.name, self.kind)
            if state == 'present':
                shared_state = self.module.params['shared_state']
                mode = True if shared_state == "present" else False
                owner_org_guid = None
                if self.kind == "private":
                    if self.module.params['owner_organization'] is not None:
                        owner_org_name = self.module.params['owner_organization']
                        owner_org = self.cf.search_org(owner_org_name)
                        if not owner_org:
                            msg = 'Organization %s not found' % owner_org_name
                            self.module.fail_json(msg=msg)
                        owner_org_guid = owner_org['metadata']['guid']
                    else:
                        if domain is None:
                            # It cannot a not existing private domain if owner org
                            # is not provided
                            self.module.fail_json(msg='No domain found and organization is unknown!')
                shared_org_guid = None
                if self.module.params['shared_organization'] is not None:
                    shared_org_name = self.module.params['shared_organization']
                    shared_org = self.cf.search_org(shared_org_name)
                    if not shared_org:
                        msg = 'Organization to share domain to %s not found' % shared_org_name
                        self.module.fail_json(msg=msg)
                    shared_org_guid = shared_org['metadata']['guid']
                result = self.present(domain, owner_org_guid, shared_org_guid, mode)
            elif state == 'absent':
                result = self.absent(domain)
            else:
                self.module.fail_json(msg='Invalid state: %s' % state)
        except CFException as e:
            self.module.fail_json(msg=str(e))
        except Exception as e:
            self.module.fail_json(msg="Exception: %s" % str(e))
        self.module.exit_json(**result)

    def absent(self, domain, async=False):
        changed = False
        if domain is not None:
            domain_guid = domain['metadata']['guid']
            changed = True
            if not self.module.check_mode:
                try:
                    self.cf.delete_domain(domain_guid, self.kind, async)
                except CFException as e:
                    msg = 'Cannot delete domain %s: %s' % (self.name, str(e))
                    self.module.fail_json(msg=msg)
        result = {
            'changed': changed,
            'msg': "CF %s domain %s deleted" % (self.kind, self.name)
        }
        return result
class CF_User(object):

    def __init__(self, module):
        self.module = module
        admin_user = self.module.params['admin_user']
        admin_password = self.module.params['admin_password']
        api_url = self.module.params['api_url']
        self.name = self.module.params['name']
        try:
            self.cf = CF(api_url)
            self.cf.login(admin_user, admin_password)
        except CFException as e:
            self.module.fail_json(msg=str(e))
        except Exception as e:
            self.module.fail_json(msg="Exception: %s" % str(e))

    def run(self):
        force = self.module.params['force']
        state = self.module.params['state']
        try:
            user = self.cf.search_user(self.name)
            if state == 'present':
                space_guid = None
                if self.module.params['default_organization'] is not None:
                    org = self.cf.search_org(self.module.params['default_organization'])
                    if not org:
                        self.module.fail_json(msg='Organization not found')
                    org_guid = org['metadata']['guid']
                    space_name = self.module.params['default_space']
                    space = self.cf.search_space(org_guid, space_name)
                    if not space:
                        self.module.fail_json(msg='Space not found')
                    space_guid = space['metadata']['guid']
                result = self.present(user, space_guid, force)
            elif state == 'absent':
                result = self.absent(user, True)
            else:
                self.module.fail_json(msg='Invalid state: %s' % state)
        except CFException as e:
            self.module.fail_json(msg=str(e))
        except Exception as e:
            raise
            self.module.fail_json(msg="Exception: %s" % str(e))
        self.module.exit_json(**result)

    def absent(self, user, force, async=False):
        changed = False
        if user is not None:
            user_id = user['metadata']['guid']
            changed = True
            if not self.module.check_mode:
                try:
                    self.cf.delete_user(user_id, async, force)
                except CFException as e:
                    msg = 'Cannot delete user %s: %s' % (self.name, str(e))
                    self.module.fail_json(msg=msg)
        result = {
            'changed': changed,
            'msg': "CF user %s deleted" % self.name
        }
        return result
class CF_Org_Facts(object):
    def __init__(self, module):
        self.module = module
        admin_user = self.module.params['admin_user']
        admin_password = self.module.params['admin_password']
        api_url = self.module.params['api_url']
        self.name = self.module.params['name']
        try:
            self.cf = CF(api_url)
            self.cf.login(admin_user, admin_password)
        except CFException as e:
            self.module.fail_json(msg=str(e))
        except Exception as e:
            self.module.fail_json(msg="Exception: %s" % str(e))

    def get_all_orgs(self):
        all_orgs = []
        # raise Exception(self.cf.api_url + '/v2/organizations')
        response, rcode = self.cf.request('GET', self.cf.api_url + '/v2/organizations')
        # raise Exception(response)
        if rcode == 200:
            return [ org['entity']['name'] for org in response['resources'] ]

    def get_quota(self, url):
        facts = {}
        quota, rcode = self.cf.request('GET', self.cf.api_url + url)
        if rcode == 200:
            facts['guid'] = quota['metadata']['guid']
            facts['created_at'] = quota['metadata']['created_at']
            facts['updated_at'] = quota['metadata']['updated_at']
            for key in quota['entity']:
                facts[key] = quota['entity'][key]
        return facts

    def get_private_domains(self, url, org_owner=None):
        owner_domains = []
        shared_domains = []
        domains, rcode = self.cf.request('GET', self.cf.api_url + url)
        if rcode == 200:
            for domain in domains['resources']:
                fact = {}
                fact['guid'] = domain['metadata']['guid']
                fact['created_at'] = domain['metadata']['created_at']
                fact['updated_at'] = domain['metadata']['updated_at']
                fact['name'] = domain['entity']['name']
                if org_id_owner is not None and domain['entity']['owning_organization_guid'] == org_owner:
                    owner_domains.append(fact)
                else:
                    shared_domains.append(fact)
        facts = {
            'owner_domains': owner_domains,
            'shared_domains': shared_domains
        }
        return facts

    def get_users(self, url):
        facts = []
        users, rcode = self.cf.request('GET', self.cf.api_url + url)
        if rcode == 200:
            for user in users['resources']:
                fact = {}
                fact['guid'] = user['metadata']['guid']
                fact['created_at'] = user['metadata']['created_at']
                fact['updated_at'] = user['metadata']['updated_at']
                fact['name'] = user['entity']['username']
                fact['admin'] = user['entity']['admin']
                fact['active'] = user['entity']['active']
                facts.append(fact)
        return facts

    def get_secgroups(self, url):
        facts = []
        secgroups, rcode = self.cf.request('GET', self.cf.api_url + url)
        if rcode == 200:
            for sg in secgroups['resources']:
                fact = {}
                fact['guid'] = sg['metadata']['guid']
                fact['created_at'] = sg['metadata']['created_at']
                fact['updated_at'] = sg['metadata']['updated_at']
                fact['name'] = sg['entity']['name']
                fact['running_default'] = sg['entity']['running_default']
                fact['staging_default'] = sg['entity']['staging_default']
                fact['rules'] = sg['entity']['rules']
                facts.append(fact)
        return facts

    def get_spaces(self, url, space_name=None, users_type=['developers', 'managers', 'auditors']):
        facts = []
        spaces, rcode = self.cf.request('GET', self.cf.api_url + url)
        if rcode == 200:
            for space in spaces['resources']:
                if space_name is not None and space['entity']['name'] != space_name:
                    break
                fact = {}
                fact['guid'] = space['metadata']['guid']
                fact['created_at'] = space['metadata']['created_at']
                fact['updated_at'] = space['metadata']['updated_at']
                fact['name'] = space['entity']['name']
                fact['allow_ssh'] = space['entity']['allow_ssh']
                if 'quota_definition_url' in space['entity']:
                    fact['quota'] = self.get_quota(space['entity']['quota_definition_url'])
                else:
                    fact['quota'] = {}
                fact['sec_groups'] = self.get_secgroups(space['entity']['security_groups_url'])
                fact['users'] = {}
                for user_type in users_type:
                    if user_type not in fact['users']:
                        fact['users'][user_type] = []
                    user_url = user_type + '_url'
                    if user_url in space['entity']:
                        fact['users'][user_type] = self.get_users(space['entity'][user_url])
                facts.append(fact)
        return facts

    def run(self):
        facts = {}
        try:
            space_name = self.module.params['space']
            if self.name is not None:
                org = self.cf.search_org(self.name)
                if org is not None:
                    if space_name is not None:
                        facts = self.get_spaces(org['entity']['spaces_url'], space_name)[0]
                    else:
                        facts['name'] = org['entity']['name']
                        facts['guid'] = org['metadata']['guid']
                        facts['status'] = org['entity']['status']
                        facts['created_at'] = org['metadata']['created_at']
                        facts['updated_at'] = org['metadata']['updated_at']
                        facts['spaces'] = self.get_spaces(org['entity']['spaces_url'])
                        if 'quota_definition_url' in org['entity']:
                            facts['quota'] = self.get_quota(org['entity']['quota_definition_url'])
                        else:
                            facts['quota'] = {}
                        facts['users'] = {}
                        for user_type in ['users', 'managers', 'billing_managers', 'auditors']:
                            if user_type not in facts['users']:
                                facts['users'][user_type] = []
                            user_url = user_type + '_url'
                            if user_url in org['entity']:
                                facts['users'][user_type] = self.get_users(org['entity'][user_url])
                        domains = self.get_private_domains(org['entity']['private_domains_url'], facts['guid'])
                        facts.update(domains)
            else:
                facts['orgs'] = self.get_all_orgs()
        except CFException as e:
            self.module.fail_json(msg=str(e))
        except Exception as e:
            self.module.fail_json(msg="Exception: %s" % str(e))
        result = {'ansible_facts': facts}
        self.module.exit_json(**result)