Example #1
0
 def get_routes(datapusher_name, deis_instance_id, backend_url_target_id, one, external_domain, edit):
     if datapusher_name:
         assert not deis_instance_id
         routes = routers_manager.get_datapusher_routes(datapusher_name, edit=edit)
     elif deis_instance_id:
         routes = routers_manager.get_deis_instance_routes(deis_instance_id, edit=edit)
     elif backend_url_target_id:
         routes = routers_manager.get_backend_url_routes(backend_url_target_id, edit=edit)
     else:
         raise Exception(f'invalid arguments')
     if routes:
         if one: assert len(routes) == 1, 'too many routes!'
         for route in routes:
             if external_domain:
                 data = routers_manager.get_route_frontend_hostname(route)
                 if one:
                     print(data)
                 else:
                     print(yaml.dump([data], default_flow_style=False))
             else:
                 data = {
                     'name': route['metadata']['name'],
                     'backend-url': routes_manager.get_backend_url(route),
                     'frontend-hostname': routes_manager.get_frontend_hostname(route),
                 }
                 if one:
                     print(yaml.dump(data, default_flow_style=False))
                 else:
                     print(yaml.dump([data], default_flow_style=False))
Example #2
0
 def get_routes(datapusher_name, deis_instance_id, ckan_instance_id,
                backend_url_target_id, one, external_domain, edit):
     if datapusher_name:
         assert not deis_instance_id and not ckan_instance_id and not backend_url_target_id
         routes = routers_manager.get_datapusher_routes(datapusher_name,
                                                        edit=edit)
     elif deis_instance_id:
         assert not datapusher_name and not ckan_instance_id and not backend_url_target_id
         routes = routers_manager.get_deis_instance_routes(deis_instance_id,
                                                           edit=edit)
     elif ckan_instance_id:
         assert not datapusher_name and not deis_instance_id and not backend_url_target_id
         routes = routers_manager.get_ckan_instance_routes(ckan_instance_id,
                                                           edit=edit)
     elif backend_url_target_id:
         assert not datapusher_name and not deis_instance_id and not ckan_instance_id
         routes = routers_manager.get_backend_url_routes(
             backend_url_target_id, edit=edit)
     else:
         routes = routers_manager.get_all_routes()
     if routes:
         if one: assert len(routes) == 1, 'too many routes!'
         for route in routes:
             if external_domain:
                 data = routers_manager.get_route_frontend_hostname(route)
                 if one:
                     print(data)
                 else:
                     print(yaml.dump([data], default_flow_style=False))
             else:
                 try:
                     data = {
                         'name':
                         route['metadata']['name'],
                         'backend-url':
                         routes_manager.get_backend_url(route),
                         'frontend-hostname':
                         routes_manager.get_frontend_hostname(route),
                         'router-name':
                         route['spec']['router_name']
                     }
                 except Exception as e:
                     print('Warning: %s' % repr(e))
                     continue
                 if one:
                     print(yaml.dump(data, default_flow_style=False))
                 else:
                     print(yaml.dump([data], default_flow_style=False))
def main(old_instance_id, new_instance_id, dry_run):
    dry_run = (dry_run == 'yes')
    router_names = set()
    for route in routers_manager.get_deis_instance_routes(old_instance_id):
        for label in [
                'ckan-cloud/route-deis-instance-id',
                'ckan-cloud/route-target-resource-id'
        ]:
            _assert_set(route['metadata']['labels'], label, old_instance_id,
                        new_instance_id)
        for attr in ['deis-instance-id', 'route-target-resource-id']:
            _assert_set(route['spec'], attr, old_instance_id, new_instance_id)
        kubectl.apply(route, dry_run=dry_run)
        router_names.add(route['spec']['router_name'])
    logs.info('updating routers', router_names=router_names)
    if not dry_run:
        for router_name in router_names:
            routers_manager.update(router_name)
Example #4
0
def migrate_from_deis(old_site_id,
                      new_instance_id,
                      router_name,
                      deis_instance_class,
                      skip_gitlab=False,
                      db_migration_name=None,
                      recreate=False,
                      skip_routes=False,
                      skip_solr=False,
                      skip_deployment=False,
                      no_db_proxy=False):
    assert db_migration_name, 'migration without a db migration is not supported yet'
    log_labels = {'instance': new_instance_id}
    if recreate:
        from ckan_cloud_operator.deis_ckan.instance import DeisCkanInstance
        DeisCkanInstance(new_instance_id).delete(
            force=True, wait_deleted=not db_migration_name)
    logs.info(
        f'Migrating from old site id {old_site_id} to new instance id {new_instance_id}',
        **log_labels)
    instance_kind = ckan_manager.instance_kind()
    values = kubectl.get(f'{instance_kind} {new_instance_id}', required=False)
    if values:
        logs.info('instance already exists', **log_labels)
    else:
        logs.info('creating instance', **log_labels)
        path_to_old_cluster_kubeconfig = get_path_to_old_cluster_kubeconfig()
        solr_config = get_solr_config(old_site_id,
                                      path_to_old_cluster_kubeconfig)
        assert solr_config, 'failed to get solr config name'
        instance_env = get_instance_env(old_site_id,
                                        path_to_old_cluster_kubeconfig)
        gitlab_repo = f'viderum/cloud-{old_site_id}'
        if not skip_gitlab:
            CkanGitlab().initialize(gitlab_repo)
        gitlab_registry = f'registry.gitlab.com/{gitlab_repo}'
        old_bucket_name = instance_env.get(
            'CKANEXT__S3FILESTORE__AWS_BUCKET_NAME')
        old_storage_path = instance_env.get(
            'CKANEXT__S3FILESTORE__AWS_STORAGE_PATH')
        assert old_bucket_name == 'ckan'
        assert old_storage_path and len(old_storage_path) > 1
        storage_path = f'/ckan/{old_storage_path}'
        deis_instance_class.create('from-gcloud-envvars',
                                   instance_env,
                                   gitlab_registry,
                                   solr_config,
                                   storage_path,
                                   new_instance_id,
                                   db_migration_name=db_migration_name)
    routers_env_id = routers_provider.get_env_id()
    default_root_domain = routers_provider.get_default_root_domain()
    assert routers_env_id and default_root_domain
    ckan_site_url = f'https://cc-{routers_env_id}-{new_instance_id}.{default_root_domain}'
    logs.info(
        f'updating instance and setting ckan site url to {ckan_site_url}',
        **log_labels)
    deis_instance_class(new_instance_id,
                        override_spec={
                            'envvars': {
                                'CKAN_SITE_URL': ckan_site_url
                            },
                            **({
                                'db': {
                                    'no-db-proxy': 'yes'
                                },
                                'datastore': {
                                    'no-db-proxy': 'yes'
                                }
                            } if no_db_proxy else {})
                        },
                        persist_overrides=True).update(
                            wait_ready=True,
                            skip_solr=skip_solr,
                            skip_deployment=skip_deployment)
    if routers_manager.get_deis_instance_routes(new_instance_id):
        logs.info('default instance route already exists', **log_labels)
    else:
        logs.info('creating instance route', **log_labels)
        routers_manager.create_subdomain_route(
            router_name, {
                'target-type': 'deis-instance',
                'deis-instance-id': new_instance_id,
                'root-domain': 'default',
                'sub-domain': 'default'
            })
    if not skip_routes:
        routers_manager.update(router_name, wait_ready=True)
    if not skip_solr:
        logs.info('Rebuilding solr search index', **log_labels)
        deis_instance_class(new_instance_id).ckan.paster(
            'search-index rebuild --force')