def get_labels(router_name, router_type, for_deployment=False):
    label_prefix = labels_manager.get_label_prefix()
    extra_labels = {'app': f'{label_prefix}-router-{router_name}'} if for_deployment else {}
    return labels_manager.get_resource_labels(
        get_label_suffixes(router_name, router_type),
        extra_labels=extra_labels
    )
Exemplo n.º 2
0
def _get_instance_and_type(instance_id):
    instance = crds_manager.get(INSTANCE_CRD_SINGULAR,
                                name=instance_id,
                                required=False)
    instance_type = instance['metadata']['labels'].get(
        '{}/instance-type'.format(labels_manager.get_label_prefix()))
    return instance, instance_type
Exemplo n.º 3
0
def list_configs(namespace=None, full=False, show_secrets=False):
    label_prefix = labels_manager.get_label_prefix()
    if not namespace: namespace = cluster_manager.get_operator_namespace_name()
    what = 'configmaps'
    if show_secrets:
        what += ',secrets'
    configs = kubectl.get(
        what,
        '-l',
        f'{label_prefix}/operator-config-namespace={namespace}',
        required=False)
    if configs:
        for config in configs.get('items', []):
            kind = config['kind']
            name = config.get('metadata', {}).get('name')
            data = {
                'kind': config['kind'],
                'name': config.get('metadata', {}).get('name')
            }
            if full:
                if name:
                    data['values'] = get(
                        secret_name=name if kind == 'Secret' else None,
                        configmap_name=name if kind == 'ConfigMap' else None,
                        namespace=namespace,
                        required=False)
                else:
                    data['values'] = None
            yield data
Exemplo n.º 4
0
def _get_instance_id_and_type(instance_id_or_name=None, instance_id=None, required=True):
    if instance_id:
        logs.debug(f'Getting instance type using instance_id', instance_id=instance_id)
        instance = crds_manager.get(INSTANCE_CRD_SINGULAR, name=instance_id, required=False)
        instance_name = None
    else:
        logs.debug(f'Attempting to get instance type using id', instance_id_or_name=instance_id_or_name)
        instance = crds_manager.get(INSTANCE_CRD_SINGULAR, name=instance_id_or_name, required=False)
        if instance:
            instance_id = instance_id_or_name
            instance_name = None
        else:
            logs.debug(f'Attempting to get instance type from instance name', instance_id_or_name=instance_id_or_name)
            instance_name = crds_manager.get(INSTANCE_NAME_CRD_SINGULAR, name=instance_id_or_name, required=False)
            if instance_name:
                instance_id = instance_name['spec'].get('latest-instance-id')
                logs.debug(instance_id=instance_id)
                instance = crds_manager.get(INSTANCE_CRD_SINGULAR, name=instance_id, required=False)
                instance_name = instance_id_or_name
            else:
                instance_name = None
    if instance:
        instance_type = instance['metadata']['labels'].get('{}/instance-type'.format(labels_manager.get_label_prefix()))
    else:
        instance_type = None
    logs.debug_yaml_dump(instance_name=instance_name, instance_id=instance_id, instance_type=instance_type,
                         instance=bool(instance))
    if required:
        assert instance_id and instance_type and len(instance) > 2, f'Failed to find instance (instance_id_or_name={instance_id_or_name}, instance_id={instance_id})'
    return instance_id, instance_type, instance
Exemplo n.º 5
0
def _get_helm_deployment_provider(instance):
    label_prefix = labels_manager.get_label_prefix()
    if instance['metadata'].get('annotations', {}).get(f'{label_prefix}/deployment-provider') == 'helm':
        from .helm import manager as helm_manager
        return helm_manager
    else:
        return None
Exemplo n.º 6
0
def _annotate(resource, *annotations, overwrite=True):
    label_prefix = labels_manager.get_label_prefix()
    kind = resource['kind']
    namespace = resource['metadata']['namespace']
    name = resource['metadata']['name']
    cmd = f'annotate {kind} {name}'
    for annotation in annotations:
        cmd += f' {label_prefix}/{annotation}'
    if overwrite:
        cmd += ' --overwrite'
    kubectl.check_call(cmd, namespace)
Exemplo n.º 7
0
def get_status(resource, prefix, status=None):
    if status:
        return bool(_get_annotation(resource, f'{prefix}-{status}'))
    else:
        label_prefix = labels_manager.get_label_prefix()
        prefix = f'{label_prefix}/{prefix}'
        statuses = set()
        for k, v in resource['metadata'].get('annotations', {}).items():
            if k.startswith(prefix):
                statuses.add(k.replace(prefix, ''))
        return list(statuses)
Exemplo n.º 8
0
def install_crd(singular, plural_suffix, kind_suffix, hash_names=False):
    logs.info(
        f'Installing operator crd: {singular}, {plural_suffix}, {kind_suffix}')
    _set_plural_kind_suffix(singular,
                            plural_suffix,
                            kind_suffix,
                            hash_names=hash_names)
    label_prefix = labels_manager.get_label_prefix().replace('-', '')
    kubectl.install_crd(f'{label_prefix}{plural_suffix}',
                        f'{label_prefix}{singular}',
                        get_resource_kind(singular))
Exemplo n.º 9
0
def get_all_instance_id_names():
    instance_names = crds_manager.get(INSTANCE_NAME_CRD_SINGULAR, required=False)
    instance_name_ids = {}
    if instance_names:
        for instance_name in instance_names['items']:
            instance_name_ids[instance_name['spec']['latest-instance-id']] = instance_name['spec']['name']
    label_prefix = labels_manager.get_label_prefix()
    for instance in crds_manager.get(INSTANCE_CRD_SINGULAR)['items']:
        instance_id = instance['metadata']['labels'][f'{label_prefix}/crd-ckaninstance-name']
        instance_name = instance_name_ids.pop(instance_id, None)
        yield {'id': instance_id, 'name': instance_name}
    for instance_id, instance_name in instance_name_ids.items():
        yield {'id': instance_id, 'name': instance_name}
Exemplo n.º 10
0
def _get_instance_id_and_type(instance_id_or_name=None, instance_id=None):
    if instance_id:
        instance = crds_manager.get(INSTANCE_CRD_SINGULAR, name=instance_id, required=False)
    else:
        instance = crds_manager.get(INSTANCE_CRD_SINGULAR, name=instance_id_or_name, required=False)
        if instance:
            instance_id = instance_id_or_name
    if not instance:
        assert not instance_id
        instance_name = crds_manager.get(INSTANCE_NAME_CRD_SINGULAR, name=instance_id_or_name, required=False)
        if instance_name:
            instance_id = instance_name['spec'].get('latest-instance-id')
            instance = crds_manager.get(INSTANCE_CRD_SINGULAR, name=instance_id, required=False)
        else:
            instance_id = None
    instance_type = instance['metadata']['labels'].get('{}/instance-type'.format(labels_manager.get_label_prefix())) if instance else None
    return instance_id, instance_type, instance
Exemplo n.º 11
0
def create(deployment_provider, instance_id=None, instance_name=None, values=None, values_filename=None, exists_ok=False,
           dry_run=False, update_=False, wait_ready=False, skip_deployment=False, skip_route=False, force=False):
    assert deployment_provider in ['helm']
    if not instance_id:
        if instance_name:
            instance_id = '{}-{}'.format(instance_name, _generate_password(6))
            logs.info('Generated instance id based on instance name', instance_name=instance_name, instance_id=instance_id)
        else:
            instance_id = _generate_password(12)
            logs.info('Generated instance id', instance_id=instance_id)
    if values_filename:
        assert values is None
        with open(values_filename) as f:
            values = yaml.load(f.read())
    if not exists_ok and crds_manager.get(APP_CRD_SINGULAR, name=instance_id, required=False):
        raise Exception('instance already exists')
    values_id = values.get('id')
    if values_id and values_id != instance_id:
        logs.warning(f'changing instance id in spec from {values_id} to the instance id {instance_id}')
    values.update(id=instance_id)
    logs.info('Creating instance', instance_id=instance_id)
    instance = crds_manager.get_resource(
        APP_CRD_SINGULAR, instance_id,
        extra_label_suffixes={'deployment-provider': deployment_provider},
        spec=values
    )
    label_prefix = labels_manager.get_label_prefix()
    ckan_cloud_annotations = {
        f'{label_prefix}/deployment-provider': deployment_provider,
        f'{label_prefix}/instance-id': instance_id
    }
    logs.info('setting ckan-cloud annotations', ckan_cloud_annotations=ckan_cloud_annotations)
    instance['metadata'].setdefault('annotations', {}).update(**ckan_cloud_annotations)
    kubectl.apply(instance, dry_run=dry_run)
    if instance_name:
        set_name(instance_id, instance_name, dry_run=dry_run)
    if update_:
        update(instance_id, wait_ready=wait_ready, skip_deployment=skip_deployment, skip_route=skip_route, force=force,
               dry_run=dry_run)
    return instance_id
Exemplo n.º 12
0
def list_instances(full=False, quick=False, withCredentials=False, name=None):
    if quick:
        for instance in get_all_instance_id_names():
            if name is not None and instance['name'] != name: continue
            yield {**instance, 'ready': None}
    else:
        for instance_data in get_all_instances():
            metadata_keys = ('name', )
            spec_keys = ('id', 'siteUrl', 'siteTitle', 'domain',
                         'registerSubdomain')
            try:
                spec = instance_data['spec']
                for k in spec_keys:
                    instance_data[k] = spec.get(k)
                metadata = instance_data['metadata']
                for k in metadata_keys:
                    instance_data[k] = metadata.get(k)
                instance_type = instance_data['metadata']['labels'].get(
                    '{}/instance-type'.format(
                        labels_manager.get_label_prefix()))
                deployment = deployment_manager.get(instance_data['id'],
                                                    instance_type,
                                                    instance_data)
                instance_data['ready'] = deployment.get('ready')
            except Exception as e:
                pass
            if not full:
                instance_data = dict(
                    (k, v) for k, v in instance_data.items()
                    if k in ('ready', *spec_keys, *metadata_keys))
            if withCredentials:
                instance_data['admin_password'] = config_manager.get(
                    'CKAN_ADMIN_PASSWORD',
                    secret_name='ckan-admin-password',
                    namespace=instance_data['id'])
            yield instance_data
Exemplo n.º 13
0
def get_crd(singular, full=True, debug=False):
    if debug: full = True
    plural_suffix, kind_suffix = _get_plural_kind_suffix(singular)
    label_prefix = labels_manager.get_label_prefix().replace('-', '')
    data = {
        'singular': f'{label_prefix}{singular}',
        'plural': f'{label_prefix}{plural_suffix}',
        'kind': get_resource_kind(singular),
        'singular-suffix': singular
    }
    if full:
        data['resources'] = []
        items = get(singular)
        if items:
            for resource in items.get('items', []):
                resource_data = {
                    'name': resource.get('metadata', {}).get('name')
                }
                if debug:
                    resource_data['labels'] = resource.get('metadata',
                                                           {}).get('labels')
                    resource_data['spec'] = resource.get('spec')
                data['resources'].append(resource_data)
    return data
Exemplo n.º 14
0
def create_volume(disk_size_gb, zone):
    label_prefix = labels_manager.get_label_prefix()
    print(
        manager.create_volume(
            disk_size_gb, {f'{label_prefix}/operator-volume-source': 'cli'},
            zone=zone))
Exemplo n.º 15
0
def get_global_annotations(with_timestamp=True):
    label_prefix = labels_manager.get_label_prefix()
    return {
        f'{label_prefix}/operator-timestamp': str(datetime.datetime.now())
    } if with_timestamp else {}
Exemplo n.º 16
0
def _get_annotation(resource, annotation, default=None):
    label_prefix = labels_manager.get_label_prefix()
    return resource['metadata'].get('annotations',
                                    {}).get(f'{label_prefix}/{annotation}',
                                            default)