Example #1
0
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
Example #2
0
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
Example #4
0
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)
    ))
Example #5
0
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))
Example #6
0
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
Example #9
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