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_env(args: Tuple[str, ...]) -> None: _logger.debug("args: %s", args) if len(args) == 2: env_name: str = args[0] skip_images_remote_flag: str = str(args[1]) 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.") 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, add_images=[], remove_images=[], eks_system_masters_roles_changes=changeset. eks_system_masters_roles_changeset if changeset else None, ) _logger.debug("Env Stack deployed") if skip_images_remote_flag == "skip-images": _logger.debug("Docker images build skipped") else: deploy_images_remotely(context=context) _logger.debug("Docker Images 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")
def deploy_env(args: Tuple[str, ...]) -> None: _logger.debug("args: %s", args) if len(args) == 2: env_name: str = args[0] skip_images_remote_flag: str = str(args[1]) 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.") 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") deploy_images_remotely(context=context, skip_images=skip_images_remote_flag == "skip-images") _logger.debug("Docker Images 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, include_teams=False) ContextSerDe.dump_context_to_ssm(context=context)
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(env_name: str, manifest_dir: str) -> None: _logger.debug("env_name: %s", env_name) 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.") @codeseeder.remote_function( "orbit", codebuild_role=context.toolkit.admin_role, extra_dirs={ "manifests": manifest_dir, }, extra_local_modules={ "aws-orbit-jupyterlab-orbit": os.path.realpath(os.path.join(ORBIT_CLI_ROOT, "../../jupyterlab_orbit")), "aws-orbit-emr-on-eks": os.path.realpath(os.path.join(ORBIT_CLI_ROOT, "../../plugins/emr_on_eks")), "aws-orbit-custom-cfn": os.path.realpath(os.path.join(ORBIT_CLI_ROOT, "../../plugins/custom_cfn")), "aws-orbit-hello-world": os.path.realpath(os.path.join(ORBIT_CLI_ROOT, "../../plugins/hello_world")), "aws-orbit-lustre": os.path.realpath(os.path.join(ORBIT_CLI_ROOT, "../../plugins/lustre")), "aws-orbit-overprovisioning": os.path.realpath( os.path.join(ORBIT_CLI_ROOT, "../../plugins/overprovisioning") ), "aws-orbit-ray": os.path.realpath(os.path.join(ORBIT_CLI_ROOT, "../../plugins/ray")), "aws-orbit-redshift": os.path.realpath(os.path.join(ORBIT_CLI_ROOT, "../../plugins/redshift")), "aws-orbit-sm-operator": os.path.realpath(os.path.join(ORBIT_CLI_ROOT, "../../plugins/sm-operator")), "aws-orbit-team-script-launcher": os.path.realpath( os.path.join(ORBIT_CLI_ROOT, "../../plugins/team_script_launcher") ), "aws-orbit-voila": os.path.realpath(os.path.join(ORBIT_CLI_ROOT, "../../plugins/voila")), "aws-orbit-code-commit": os.path.realpath(os.path.join(ORBIT_CLI_ROOT, "../../plugins/code_commit")), }, ) 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") deploy_teams(env_name=env_name, manifest_dir=manifest_dir)
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)