def deploy_env( filename: str, debug: bool, ) -> None: with MessagesContext("Deploying", debug=debug) as msg_ctx: msg_ctx.progress(2) manifest: "Manifest" = ManifestSerDe.load_manifest_from_file(filename=filename, type=Manifest) msg_ctx.info(f"Manifest loaded: {filename}") msg_ctx.progress(5) manifest_dir: str = os.path.dirname(os.path.abspath(filename)) _logger.debug("manifest directory is set to %s", manifest_dir) manifest_validations(manifest) context: "Context" = ContextSerDe.load_context_from_manifest(manifest=manifest) msg_ctx.info("Current Context loaded") msg_ctx.progress(10) _logger.debug("Inspecting possible manifest changes...") changeset: "Changeset" = extract_changeset(manifest=manifest, context=context, msg_ctx=msg_ctx) _logger.debug(f"Changeset:\n{dump_changeset_to_str(changeset=changeset)}") msg_ctx.progress(15) _deploy_toolkit( context=context, ) msg_ctx.info("Toolkit deployed") msg_ctx.progress(30) deploy.deploy_env( env_name=context.name, manifest_dir=manifest_dir, ) msg_ctx.info("Orbit Workbench deployed") msg_ctx.progress(98) if cfn.does_stack_exist(stack_name=context.env_stack_name): context = ContextSerDe.load_context_from_manifest(manifest=manifest) msg_ctx.info(f"Context updated: {filename}") msg_ctx.progress(99) if context.cognito_users_url: msg_ctx.tip(f"Add users: {stylize(context.cognito_users_url, underline=True)}") else: RuntimeError("Cognito Users URL not found.") if context.landing_page_url: msg_ctx.tip(f"Access Orbit Workbench: {stylize(f'{context.landing_page_url}/orbit/login', underline=True)}") else: RuntimeError("Landing Page URL not found.") msg_ctx.progress(100)
def deploy_credentials(filename: str, username: str, password: str, registry: str, debug: bool) -> None: with MessagesContext("Deploying", debug=debug) as msg_ctx: msg_ctx.progress(2) manifest: "Manifest" = ManifestSerDe.load_manifest_from_file(filename=filename, type=Manifest) msg_ctx.info(f"Manifest loaded: {filename}") msg_ctx.progress(3) context_parameter_name: str = f"/orbit/{manifest.name}/context" if not ssm.does_parameter_exist(name=context_parameter_name): msg_ctx.error(f"Orbit Environment {manifest.name} cannot be found in the current account and region.") return context: "Context" = ContextSerDe.load_context_from_manifest(manifest=manifest) msg_ctx.info("Current Context loaded") msg_ctx.progress(4) msg_ctx.info("Encrypting credentials with Toolkit KMS Key") ciphertext = kms.encrypt( context=context, plaintext=json.dumps({registry: {"username": username, "password": password}}) ) msg_ctx.progress(20) msg_ctx.info("Starting Remote CodeBuild to deploy credentials") deploy.deploy_credentials(env_name=context.name, ciphertext=ciphertext) msg_ctx.info("Registry Credentials deployed") msg_ctx.progress(98) if cfn.does_stack_exist(stack_name=context.env_stack_name): context = ContextSerDe.load_context_from_ssm(env_name=manifest.name, type=Context) msg_ctx.info(f"Context updated: {filename}") msg_ctx.progress(100)
def deploy_teams( filename: str, debug: bool, ) -> None: with MessagesContext("Deploying", debug=debug) as msg_ctx: msg_ctx.progress(2) manifest: "Manifest" = ManifestSerDe.load_manifest_from_file(filename=filename, type=Manifest) msg_ctx.info(f"Manifest loaded: {filename}") msg_ctx.info(f"Teams: {','.join([t.name for t in manifest.teams])}") msg_ctx.progress(5) manifest_dir: str = os.path.dirname(os.path.abspath(filename)) _logger.debug("manifest directory is set to %s", manifest_dir) context_parameter_name: str = f"/orbit/{manifest.name}/context" if not ssm.does_parameter_exist(name=context_parameter_name): msg_ctx.error(f"Orbit Environment {manifest.name} cannot be found in the current account and region.") return context: "Context" = ContextSerDe.load_context_from_manifest(manifest=manifest) msg_ctx.info("Current Context loaded") msg_ctx.info(f"Teams: {','.join([t.name for t in context.teams])}") msg_ctx.progress(10) _logger.debug("Inspecting possible manifest changes...") changeset: "Changeset" = extract_changeset(manifest=manifest, context=context, msg_ctx=msg_ctx) _logger.debug(f"Changeset:\n{dump_changeset_to_str(changeset=changeset)}") msg_ctx.progress(30) deploy.deploy_teams( env_name=context.name, manifest_dir=manifest_dir, ) msg_ctx.info("Orbit Workbench deployed") msg_ctx.progress(98) if cfn.does_stack_exist(stack_name=context.env_stack_name): context = ContextSerDe.load_context_from_ssm(env_name=manifest.name, type=Context) msg_ctx.info(f"Context updated: {filename}") msg_ctx.progress(99) if context.user_pool_id: cognito_users_url = orbit_cognito.get_users_url(user_pool_id=context.user_pool_id, region=context.region) msg_ctx.tip(f"Add users: {stylize(cognito_users_url, underline=True)}") if context.landing_page_url: msg_ctx.tip(f"Access Orbit Workbench: {stylize(f'{context.landing_page_url}/orbit/login', underline=True)}") else: raise RuntimeError("Landing Page URL not found.") msg_ctx.progress(100)
def deploy_toolkit( filename: str, debug: bool, ) -> None: with MessagesContext("Deploying", debug=debug) as msg_ctx: msg_ctx.progress(10) manifest: "Manifest" = ManifestSerDe.load_manifest_from_file(filename=filename, type=Manifest) msg_ctx.info(f"Manifest loaded: {filename}") msg_ctx.progress(25) context: "Context" = ContextSerDe.load_context_from_manifest(manifest=manifest) msg_ctx.info("Current Context loaded") msg_ctx.progress(45) _deploy_toolkit( context=context, ) msg_ctx.info("Toolkit deployed") msg_ctx.progress(100)
def deploy_teams( filename: str, debug: bool, ) -> None: with MessagesContext("Deploying", debug=debug) as msg_ctx: msg_ctx.progress(2) manifest: "Manifest" = ManifestSerDe.load_manifest_from_file( filename=filename, type=Manifest) msg_ctx.info(f"Manifest loaded: {filename}") msg_ctx.info(f"Teams: {','.join([t.name for t in manifest.teams])}") msg_ctx.progress(3) context: "Context" = ContextSerDe.load_context_from_manifest( manifest=manifest) msg_ctx.info("Current Context loaded") msg_ctx.info(f"Teams: {','.join([t.name for t in context.teams])}") msg_ctx.progress(4) _logger.debug("Inspecting possible manifest changes...") changeset: "Changeset" = extract_changeset(manifest=manifest, context=context, msg_ctx=msg_ctx) _logger.debug( f"Changeset:\n{dump_changeset_to_str(changeset=changeset)}") msg_ctx.progress(5) plugins.PLUGINS_REGISTRIES.load_plugins( context=context, msg_ctx=msg_ctx, plugin_changesets=changeset.plugin_changesets, teams_changeset=changeset.teams_changeset, ) msg_ctx.progress(7) _logger.debug("Preparing bundle directory") dirs: List[Tuple[str, str]] = [] dirs += _get_config_dirs(context=context, manifest_filename=filename) _logger.debug(f"*Directory={dirs}") dirs += _get_images_dirs(context=context, manifest_filename=filename, skip_images=True) _logger.debug(f"**Directory={dirs}") bundle_path = bundle.generate_bundle( command_name="deploy", context=context, dirs=dirs, ) msg_ctx.progress(11) buildspec = codebuild.generate_spec( context=context, plugins=True, cmds_build=[f"orbit remote --command deploy_teams {context.name}"], changeset=changeset, ) remote.run( command_name="deploy", context=context, bundle_path=bundle_path, buildspec=buildspec, codebuild_log_callback=msg_ctx.progress_bar_callback, timeout=90, ) msg_ctx.info("Orbit Workbench deployed") msg_ctx.progress(98) if cfn.does_stack_exist(stack_name=context.env_stack_name): context = ContextSerDe.load_context_from_manifest( manifest=manifest) msg_ctx.info(f"Context updated: {filename}") msg_ctx.progress(99) if context.cognito_users_url: msg_ctx.tip( f"Add users: {stylize(context.cognito_users_url, underline=True)}" ) else: RuntimeError("Cognito Users URL not found.") if context.landing_page_url: msg_ctx.tip( f"Access Orbit Workbench: {stylize(context.landing_page_url, underline=True)}" ) else: RuntimeError("Landing Page URL not found.") msg_ctx.progress(100)
def deploy_env( filename: str, skip_images: bool, debug: bool, username: Optional[str] = None, password: Optional[str] = None, ) -> None: with MessagesContext("Deploying", debug=debug) as msg_ctx: msg_ctx.progress(2) manifest: "Manifest" = ManifestSerDe.load_manifest_from_file( filename=filename, type=Manifest) msg_ctx.info(f"Manifest loaded: {filename}") msg_ctx.progress(3) context: "Context" = ContextSerDe.load_context_from_manifest( manifest=manifest) image_manifests = { "code_build": manifest.images.code_build, "landing_page": manifest.images.landing_page } for name in context.images.names: if name not in ["code_build", "image_replicator"]: image_manifests[name] = getattr( context.images, name) if skip_images else getattr( manifest.images, name) context.images = ImagesManifest(**image_manifests) # type: ignore msg_ctx.info("Current Context loaded") msg_ctx.progress(4) _logger.debug("Inspecting possible manifest changes...") changeset: "Changeset" = extract_changeset(manifest=manifest, context=context, msg_ctx=msg_ctx) _logger.debug( f"Changeset:\n{dump_changeset_to_str(changeset=changeset)}") msg_ctx.progress(5) deploy_toolkit( context=context, username=username, password=password, msg_ctx=msg_ctx, ) msg_ctx.info("Toolkit deployed") msg_ctx.progress(10) bundle_path = bundle.generate_bundle( command_name="deploy", context=context, dirs=_get_images_dirs(context=context, manifest_filename=filename, skip_images=skip_images), ) msg_ctx.progress(11) skip_images_remote_flag: str = "skip-images" if skip_images else "no-skip-images" buildspec = codebuild.generate_spec( context=context, plugins=True, cmds_build=[ f"orbit remote --command deploy_env {context.name} {skip_images_remote_flag}" ], changeset=changeset, ) remote.run( command_name="deploy", context=context, bundle_path=bundle_path, buildspec=buildspec, codebuild_log_callback=msg_ctx.progress_bar_callback, timeout=90, ) msg_ctx.info("Orbit Workbench deployed") msg_ctx.progress(98) if cfn.does_stack_exist(stack_name=context.env_stack_name): context = ContextSerDe.load_context_from_manifest( manifest=manifest) msg_ctx.info(f"Context updated: {filename}") msg_ctx.progress(99) if context.cognito_users_url: msg_ctx.tip( f"Add users: {stylize(context.cognito_users_url, underline=True)}" ) else: RuntimeError("Cognito Users URL not found.") if context.landing_page_url: msg_ctx.tip( f"Access Orbit Workbench: {stylize(context.landing_page_url, underline=True)}" ) else: RuntimeError("Landing Page URL not found.") msg_ctx.progress(100)
def deploy_foundation( filename: Optional[str] = None, name: Optional[str] = None, debug: bool = False, internet_accessibility: bool = True, codeartifact_domain: Optional[str] = None, codeartifact_repository: Optional[str] = None, username: Optional[str] = None, password: Optional[str] = None, ) -> None: with MessagesContext("Deploying", debug=debug) as msg_ctx: msg_ctx.progress(2) if filename: manifest: "FoundationManifest" = ManifestSerDe.load_manifest_from_file( filename=filename, type=FoundationManifest) if name or codeartifact_domain or codeartifact_repository: msg_ctx.warn( f'Reading parameters from {filename}, "name", "codeartifact-domain", ' 'and "codeartifact-repository" ignored.') elif name: manifest: FoundationManifest = FoundationManifest( # type: ignore name=name, codeartifact_domain=codeartifact_domain, codeartifact_repository=codeartifact_repository, ssm_parameter_name=f"/orbit-foundation/{name}/manifest", networking=NetworkingManifest(data=DataNetworkingManifest( internet_accessible=internet_accessibility)), ) else: msg_ctx.error('One of "filename" or "name" is required') raise ValueError('One of "filename" or "name" is required') ManifestSerDe.dump_manifest_to_ssm(manifest=manifest) msg_ctx.info(f"Manifest loaded: {manifest.name}") msg_ctx.progress(3) context: FoundationContext = ContextSerDe.load_context_from_manifest( manifest=manifest) msg_ctx.info("Current Context loaded") msg_ctx.progress(4) deploy_toolkit( context=cast(Context, context), username=username, password=password, msg_ctx=msg_ctx, top_level="orbit-foundation", ) msg_ctx.info("Toolkit deployed") msg_ctx.progress(8) bundle_path = bundle.generate_bundle(command_name="deploy_foundation", context=cast(Context, context)) msg_ctx.progress(10) buildspec = codebuild.generate_spec( context=cast(Context, context), plugins=False, cmds_build=[ f"orbit remote --command deploy_foundation {context.name}" ], ) msg_ctx.progress(11) remote.run( command_name="deploy_foundation", context=cast(Context, context), bundle_path=bundle_path, buildspec=buildspec, codebuild_log_callback=msg_ctx.progress_bar_callback, timeout=90, ) msg_ctx.info("Orbit Foundation deployed") msg_ctx.progress(100)
def deploy_foundation( filename: Optional[str] = None, name: Optional[str] = None, debug: bool = False, internet_accessibility: bool = True, ssl_cert_arn: Optional[str] = None, custom_domain_name: Optional[str] = None, max_availability_zones: Optional[int] = None, role_prefix: Optional[str] = None, ) -> None: with MessagesContext("Deploying", debug=debug) as msg_ctx: msg_ctx.progress(2) if filename: manifest: "FoundationManifest" = ManifestSerDe.load_manifest_from_file( filename=filename, type=FoundationManifest ) if name: msg_ctx.warn(f'Reading parameters from {filename}, "name" ignored.') elif name: if ssl_cert_arn: if not custom_domain_name: raise ValueError('If "ssl_cert_arn" is provided, "custom_domain_name" should be provided') if custom_domain_name: if not ssl_cert_arn: raise ValueError('If "custom_domain_name" is provided, "ssl_cert_arn" should be provided') manifest: FoundationManifest = FoundationManifest( # type: ignore name=name, ssm_parameter_name=f"/orbit-f/{name}/manifest", role_prefix=role_prefix, networking=NetworkingManifest( max_availability_zones=max_availability_zones, frontend=FrontendNetworkingManifest( ssl_cert_arn=ssl_cert_arn, custom_domain_name=custom_domain_name ), data=DataNetworkingManifest(internet_accessible=internet_accessibility), ), ) else: msg_ctx.error('One of "filename" or "name" is required') raise ValueError('One of "filename" or "name" is required') ManifestSerDe.dump_manifest_to_ssm(manifest=manifest) msg_ctx.info(f"Manifest loaded: {manifest.name}") msg_ctx.progress(3) context: FoundationContext = ContextSerDe.load_context_from_manifest(manifest=manifest) msg_ctx.info("Current Context loaded") msg_ctx.progress(4) _deploy_toolkit( context=cast(Context, context), top_level="orbit-f", ) msg_ctx.info("Toolkit deployed") msg_ctx.progress(50) deploy.deploy_foundation(env_name=context.name) msg_ctx.info("Orbit Foundation deployed") msg_ctx.progress(100)