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_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_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 main() -> None: _logger.debug("sys.argv: %s", sys.argv) if len(sys.argv) == 3: context: "Context" = ContextSerDe.load_context_from_ssm( env_name=sys.argv[1], type=Context) team_name: str = sys.argv[2] else: raise ValueError("Unexpected number of values in sys.argv.") changeset: Optional["Changeset"] = load_changeset_from_ssm( env_name=context.name) _logger.debug("Changeset loaded.") team_policies: Optional[List[str]] = None image: Optional[str] = None if changeset and changeset.teams_changeset and team_name in changeset.teams_changeset.added_teams_names: manifest: Optional["Manifest"] = ManifestSerDe.load_manifest_from_ssm( env_name=sys.argv[1], type=Manifest) if manifest is None: raise ValueError("manifest is None!") team_manifest: Optional["TeamManifest"] = manifest.get_team_by_name( name=team_name) if team_manifest: team_policies = team_manifest.policies image = team_manifest.image else: raise ValueError(f"{team_name} not found in manifest!") else: team_context: Optional["TeamContext"] = context.get_team_by_name( name=team_name) if team_context: team_policies = team_context.policies image = team_context.image else: raise ValueError(f"Team {team_name} not found in the context.") if team_policies is None: raise ValueError("team_policies is None!") stack_name: str = f"orbit-{context.name}-{team_name}" outdir = os.path.join(".orbit.out", context.name, "cdk", stack_name) os.makedirs(outdir, exist_ok=True) shutil.rmtree(outdir) app = App(outdir=outdir) Team(scope=app, id=stack_name, context=context, team_name=team_name, team_policies=team_policies, image=image) app.synth(force=True)
def deploy_env(env_name: str, manifest_dir: str) -> None: _logger.debug("env_name: %s", env_name) manifest: Optional[Manifest] = ManifestSerDe.load_manifest_from_ssm(env_name=env_name, type=Manifest) _logger.debug("Manifest loaded.") context: "Context" = ContextSerDe.load_context_from_ssm(env_name=env_name, type=Context) _logger.debug("Context loaded.") changeset: Optional["Changeset"] = load_changeset_from_ssm(env_name=env_name) _logger.debug("Changeset loaded.") if manifest is None: raise Exception("Unable to load Manifest") @codeseeder.remote_function( "orbit", codebuild_role=context.toolkit.admin_role, extra_dirs={ "manifests": manifest_dir, }, ) def deploy_env(env_name: str, manifest_dir: str) -> None: docker.login(context=context) _logger.debug("DockerHub and ECR Logged in") cdk_toolkit.deploy(context=context) _logger.debug("CDK Toolkit Stack deployed") env.deploy( context=context, eks_system_masters_roles_changes=changeset.eks_system_masters_roles_changeset if changeset else None, ) _logger.debug("Env Stack deployed") eksctl.deploy_env( context=context, changeset=changeset, ) _logger.debug("EKS Environment Stack deployed") kubectl.deploy_env(context=context) _logger.debug("Kubernetes Environment components deployed") helm.deploy_env(context=context) _logger.debug("Helm Charts installed") k8s_context = utils.get_k8s_context(context=context) kubectl.fetch_kubectl_data(context=context, k8s_context=k8s_context) ContextSerDe.dump_context_to_ssm(context=context) _logger.debug("Updating userpool redirect") _update_userpool_client(context=context) _update_userpool(context=context) deploy_env(env_name=env_name, manifest_dir=manifest_dir)
def deploy_images(debug: bool, filename: str, reqested_image: 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_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 env = manifest.name msg_ctx.info(f"Deploying images for env {env}") deploy.deploy_images_remotely(env=env, requested_image=reqested_image) msg_ctx.progress(95) 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(args: Tuple[str, ...]) -> None: _logger.debug("args: %s", args) if len(args) == 1: env_name: str = args[0] else: raise ValueError("Unexpected number of values in args") context: "Context" = ContextSerDe.load_context_from_ssm(env_name=env_name, type=Context) _logger.debug("Context loaded.") changeset: Optional["Changeset"] = load_changeset_from_ssm(env_name=env_name) _logger.debug("Changeset loaded.") if changeset: plugins.PLUGINS_REGISTRIES.load_plugins( context=context, plugin_changesets=changeset.plugin_changesets, teams_changeset=changeset.teams_changeset ) _logger.debug("Plugins loaded") docker.login(context=context) _logger.debug("DockerHub and ECR Logged in") if changeset and changeset.teams_changeset and changeset.teams_changeset.removed_teams_names: kubectl.write_kubeconfig(context=context) for team_name in changeset.teams_changeset.removed_teams_names: team_context: Optional["TeamContext"] = context.get_team_by_name(name=team_name) if team_context is None: raise RuntimeError(f"TeamContext {team_name} not found!") _logger.debug("Destroying team %s", team_name) plugins.PLUGINS_REGISTRIES.destroy_team_plugins(context=context, team_context=team_context) _logger.debug("Team Plugins destroyed") helm.destroy_team(context=context, team_context=team_context) _logger.debug("Team Helm Charts uninstalled") kubectl.destroy_team(context=context, team_context=team_context) _logger.debug("Kubernetes Team components destroyed") eksctl.destroy_team(context=context, team_context=team_context) _logger.debug("EKS Team Stack destroyed") teams.destroy_team(context=context, team_context=team_context) _logger.debug("Team %s destroyed", team_name) context.remove_team_by_name(name=team_name) ContextSerDe.dump_context_to_ssm(context=context) team_names = [t.name for t in context.teams] if changeset and changeset.teams_changeset and changeset.teams_changeset.added_teams_names: team_names.extend(changeset.teams_changeset.added_teams_names) manifest: Optional["Manifest"] = ManifestSerDe.load_manifest_from_ssm(env_name=context.name, type=Manifest) if manifest is None: raise RuntimeError(f"Manifest {context.name} not found!") kubectl.write_kubeconfig(context=context) for team_name in team_names: team_manifest = manifest.get_team_by_name(name=team_name) if team_manifest is None: raise RuntimeError(f"TeamManifest {team_name} not found!") teams.deploy_team(context=context, manifest=manifest, team_manifest=team_manifest) _logger.debug("Team Stacks deployed") team_context = context.get_team_by_name(name=team_name) if team_context is None: raise RuntimeError(f"TeamContext {team_name} not found!") eksctl.deploy_team(context=context, team_context=team_context) _logger.debug("EKS Team Stack deployed") kubectl.deploy_team(context=context, team_context=team_context) _logger.debug("Kubernetes Team components deployed") helm.deploy_team(context=context, team_context=team_context) _logger.debug("Team Helm Charts installed") plugins.PLUGINS_REGISTRIES.deploy_team_plugins( context=context, team_context=team_context, changes=changeset.plugin_changesets if changeset else [] ) team_context.plugins = team_manifest.plugins ContextSerDe.dump_context_to_ssm(context=context) _logger.debug("Team Plugins deployed") k8s_context = utils.get_k8s_context(context=context) kubectl.fetch_kubectl_data(context=context, k8s_context=k8s_context, include_teams=True) _logger.debug("Teams deployed")
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)
def deploy_teams(env_name: str, manifest_dir: str) -> None: if changeset: plugins.PLUGINS_REGISTRIES.load_plugins( context=context, plugin_changesets=changeset.plugin_changesets, teams_changeset=changeset.teams_changeset, ) _logger.debug("Plugins loaded") docker.login(context=context) _logger.debug("DockerHub and ECR Logged in") if changeset and changeset.teams_changeset and changeset.teams_changeset.removed_teams_names: kubectl.write_kubeconfig(context=context) for team_name in changeset.teams_changeset.removed_teams_names: team_context: Optional["TeamContext"] = context.get_team_by_name(name=team_name) if team_context is None: raise RuntimeError(f"TeamContext {team_name} not found!") _logger.debug("Destory all user namespaces for %s", team_context.name) sh.run(f"kubectl delete namespaces -l orbit/team={team_context.name},orbit/space=user --wait=true") _logger.debug("Destroying team %s", team_name) plugins.PLUGINS_REGISTRIES.destroy_team_plugins(context=context, team_context=team_context) _logger.debug("Team Plugins destroyed") helm.destroy_team(context=context, team_context=team_context) _logger.debug("Team Helm Charts uninstalled") kubectl.destroy_team(context=context, team_context=team_context) _logger.debug("Kubernetes Team components destroyed") eksctl.destroy_team(context=context, team_context=team_context) _logger.debug("EKS Team Stack destroyed") teams.destroy_team(context=context, team_context=team_context) _logger.debug("Team %s destroyed", team_name) context.remove_team_by_name(name=team_name) ContextSerDe.dump_context_to_ssm(context=context) team_names = [t.name for t in context.teams] if changeset and changeset.teams_changeset and changeset.teams_changeset.added_teams_names: team_names.extend(changeset.teams_changeset.added_teams_names) manifest: Optional["Manifest"] = ManifestSerDe.load_manifest_from_ssm(env_name=context.name, type=Manifest) if manifest is None: raise RuntimeError(f"Manifest {context.name} not found!") kubectl.write_kubeconfig(context=context) for team_name in team_names: team_manifest = manifest.get_team_by_name(name=team_name) if team_manifest is None: raise RuntimeError(f"TeamManifest {team_name} not found!") teams.deploy_team(context=context, manifest=manifest, team_manifest=team_manifest) _logger.debug("Team Stacks deployed") team_context = context.get_team_by_name(name=team_name) if team_context is None: raise RuntimeError(f"TeamContext {team_name} not found!") eksctl.deploy_team(context=context, team_context=team_context) _logger.debug("EKS Team Stack deployed") kubectl.deploy_team(context=context, team_context=team_context) _logger.debug("Kubernetes Team components deployed") helm.deploy_team(context=context, team_context=team_context) _logger.debug("Team Helm Charts installed") plugins.PLUGINS_REGISTRIES.deploy_team_plugins( context=context, team_context=team_context, changes=changeset.plugin_changesets if changeset else [] ) team_context.plugins = team_manifest.plugins ContextSerDe.dump_context_to_ssm(context=context) _logger.debug("Team Plugins deployed") _logger.debug("Teams deployed")
def main() -> None: _logger.debug("sys.argv: %s", sys.argv) if len(sys.argv) == 3: context: "Context" = ContextSerDe.load_context_from_ssm( env_name=sys.argv[1], type=Context) team_name: str = sys.argv[2] else: raise ValueError("Unexpected number of values in sys.argv.") changeset: Optional["Changeset"] = load_changeset_from_ssm( env_name=context.name) _logger.debug("Changeset loaded.") team_policies: Optional[List[str]] = None image: Optional[str] = None if changeset and changeset.teams_changeset and team_name in changeset.teams_changeset.added_teams_names: manifest: Optional["Manifest"] = ManifestSerDe.load_manifest_from_ssm( env_name=sys.argv[1], type=Manifest) if manifest is None: raise ValueError("manifest is None!") team_manifest: Optional["TeamManifest"] = manifest.get_team_by_name( name=team_name) if team_manifest: team_policies = team_manifest.policies image = team_manifest.image else: raise ValueError(f"{team_name} not found in manifest!") else: team_context: Optional["TeamContext"] = context.get_team_by_name( name=team_name) if team_context: team_policies = team_context.policies image = team_context.image else: raise ValueError(f"Team {team_name} not found in the context.") if team_policies is None: raise ValueError("team_policies is None!") stack_name: str = f"orbit-{context.name}-{team_name}" outdir = os.path.join(".orbit.out", context.name, "cdk", stack_name) os.makedirs(outdir, exist_ok=True) shutil.rmtree(outdir) app = App(outdir=outdir) @jsii.implements(core.IAspect) class AddDeployPathIAM: """ Implementing CDK Aspects to add optional IAM Role prefix to IAM roles """ def visit(self, node: IConstruct) -> None: """ Function to implement a path pattern """ if isinstance(node, iam.CfnRole): node.path = f"/{context.role_prefix}/" if context.role_prefix else "/" team_stack = Team(scope=app, id=stack_name, context=context, team_name=team_name, team_policies=team_policies, image=image) Aspects.of(scope=cast(IConstruct, team_stack)).add( cast(IAspect, AddDeployPathIAM())) app.synth(force=True)