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 )
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
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
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
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
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)
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)
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))
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}
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
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
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
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
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))
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 {}
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)