def create(instance_type, 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): if not instance_id: if instance_name: instance_id = '{}-{}'.format(instance_name, _generate_password(6)) else: instance_id = _generate_password(12) if values_filename: assert values is None if values_filename != '-': with open(values_filename) as f: values = yaml.load(f.read()) else: values = yaml.load(sys.stdin.read()) if not exists_ok and crds_manager.get(INSTANCE_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['id'] = instance_id logs.info('Creating instance', instance_id=instance_id) kubectl.apply(crds_manager.get_resource( INSTANCE_CRD_SINGULAR, instance_id, extra_label_suffixes={'instance-type': instance_type}, spec=values ), 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 set_name(instance_id, instance_name, dry_run=False): resource = crds_manager.get(APP_NAME_CRD_SINGULAR, name=instance_name, required=False) if resource: resource['spec']['latest-instance-id'] = instance_id if not resource['spec']['instance-ids'].get(instance_id): resource['spec']['instance-ids'][instance_id] = { 'added': datetime.datetime.now() } else: resource = crds_manager.get_resource( APP_NAME_CRD_SINGULAR, instance_name, spec={ 'name': instance_name, 'latest-instance-id': instance_id, 'instance-ids': { instance_id: { 'added': datetime.datetime.now() } } }) if dry_run: logs.print_yaml_dump(resource) else: kubectl.apply(resource)
def create(instance_type, instance_id=None, instance_name=None, values=None, values_filename=None, exists_ok=False, dry_run=False): if not instance_id: if instance_name: instance_id = '{}-{}'.format(instance_name, _generate_password(6)) else: instance_id = _generate_password(12) 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(INSTANCE_CRD_SINGULAR, name=instance_id, required=False): raise Exception('instance already exists') values_id = values.get('id') if values_id: assert values_id == instance_id, f'instance spec has conflicting instance_id ({values_id} != {instance_id})' values['id'] = instance_id logs.info('Creating instance', instance_id=instance_id) kubectl.apply(crds_manager.get_resource( INSTANCE_CRD_SINGULAR, instance_id, extra_label_suffixes={'instance-type': instance_type}, spec=values ), dry_run=dry_run) if instance_name: set_name(instance_id, instance_name, dry_run=dry_run) return instance_id
def create(name, role): logs.info(f'Creating user {name} (role={role})') kubectl.apply(crds_manager.get_resource( CRD_SINGULAR, name, spec=_get_spec(name, role), extra_label_suffixes=get_user_labels(name, role) ))
def create(name, role): logs.info(f'Creating user {name} (role={role})') try: extra_label_suffixes = get_user_labels(name, role) except AssertionError: logs.info('No user labels found, initializing and retrying') initialize() extra_label_suffixes = get_user_labels(name, role) kubectl.apply( crds_manager.get_resource(CRD_SINGULAR, name, spec=_get_spec(name, role), extra_label_suffixes=extra_label_suffixes))
def persist(cluster_id): cluster = get_cluster(cluster_id) cluster_secrets = {'servers': {}} for server in cluster['servers']: cluster_secrets['servers'][server['name']] = server_secrets = {} with open(server['passwordfile']) as f: server_secrets['password'] = f.read() with open(server['keyfile']) as f: server_secrets['private_key'] = f.read() with open(server['keyfile'] + '.pub') as f: server_secrets['public_key'] = f.read() crds_manager.install_crd('kamateracluster', 'kamateraclusters', 'KamateraCluster') crds_manager.install_crd('kamateraserver', 'kamateraservers', 'KamateraServer') kubectl.apply( crds_manager. get_resource('kamateracluster', cluster['id'], spec={ **{ k: v for k, v in cluster.items() if k != 'servers' }, 'server_names': [server['name'] for server in cluster['servers']] })) for server in cluster['servers']: kubectl.apply( crds_manager.get_resource('kamateraserver', f'{server["name"]}', spec=server)) crds_manager.config_set( 'kamateraserver', server["name"], values=cluster_secrets['servers'][server['name']], is_secret=True) with open(f'{get_cluster_path(cluster_id)}/kube_config_rke-cluster.yml' ) as f: crds_manager.config_set( 'kamateracluster', cluster_id, values={'kube_config_rke-cluster.yml': f.read()}, is_secret=True)
def create_instance(instance_id, instance_type, values=None, values_filename=None, exists_ok=False, dry_run=False): 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( INSTANCE_CRD_SINGULAR, name=instance_id, required=False): raise Exception('instance already exists') return kubectl.apply(crds_manager.get_resource( INSTANCE_CRD_SINGULAR, instance_id, extra_label_suffixes={'instance-type': instance_type}, spec=values), dry_run=dry_run)
def create(name, spec, force=False, exists_ok=False, delete_dbs=False): migration = get(name, required=False) if migration: if force or delete_dbs: delete(name, delete_dbs=delete_dbs) elif exists_ok: return migration else: logs.error('migration name conflict: ' + str(migration.get('spec'))) raise Exception( f'migration already exists: {name}, Run with --force / --rerun / --recreate-dbs' ) logs.info(f'Creating migration name {name} (spec={spec})') migration = crds_manager.get_resource(CRD_SINGULAR, name, spec=_get_spec(name, spec), extra_label_suffixes=_get_labels( name, spec)) kubectl.apply(migration) return migration
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