def get_resource(list_resources: Callable[[], Any], log: BoundLogger, resource_type: str, resource_name: str) -> Optional[Any]: log.msg('Checking for existing {}'.format(resource_type), name=resource_name) resource_list = list_resources() matching_resources = [ d for d in resource_list.items if d.metadata.name == resource_name ] if len(matching_resources) > 2: raise ValueError('Found {} {}s matching `{}`'.format( len(matching_resources), resource_type, resource_name)) if not matching_resources: return None return matching_resources[0]
def upsert_resource(existing_resource: Optional[Any], target_resource: Any, log: BoundLogger, resource_type: str, create: Callable[[], Any], patch: Callable[[], Any]) -> Any: if existing_resource is not None: if comparisons.specs_are_the_same(existing_resource, target_resource): log.msg('Existing {} does not need to be updated'.format( resource_type), name=existing_resource.metadata.name) new_resource = existing_resource else: log.msg('Updating existing {}'.format(resource_type)) new_resource = patch() log.msg('Updated {}'.format(resource_type), name=new_resource.metadata.name) else: log.msg('Creating new {}'.format(resource_type)) new_resource = create() log.msg('Created {}'.format(resource_type), name=new_resource.metadata.name) return new_resource
def delete_resources(existing_resources: List[Any], namespace: V1Namespace, clients: Clients, log: BoundLogger): for existing_resource in existing_resources: if existing_resource is None: pass elif existing_resource.__class__ == V1Deployment: log.msg('Deleting deployment') status = clients.apps.delete_namespaced_deployment( name=existing_resource.metadata.name, namespace=namespace.metadata.name) log.msg('Deployment deleted', message=status.message) elif existing_resource.__class__ == V1Ingress: log.msg('Deleting ingress') status = clients.networking.delete_namespaced_ingress( name=existing_resource.metadata.name, namespace=namespace.metadata.name) log.msg('Ingress deleted', message=status.message) elif existing_resource.__class__ == V1Namespace: log.msg('Deleting namespace') status = clients.core.delete_namespace( name=namespace.metadata.name) log.msg('Namespace deleted', name=status.message) elif existing_resource.__class__ == V1Service: log.msg('Deleting service') svc = clients.core.delete_namespaced_service( name=existing_resource.metadata.name, namespace=namespace.metadata.name) log.msg('Service deleted', message=svc.metadata.name) else: raise NotImplementedError( 'Deleting {} is not yet supported'.format( existing_resource.__class__))