Unverified Commit de77d3f9 authored by julienmancuso's avatar julienmancuso Committed by GitHub
Browse files

feat: allow to CRUD dynamo pipelines (#761)

parent e06bfd55
...@@ -236,8 +236,6 @@ func TestDynamoNimDeploymentReconciler_FinalizeResource(t *testing.T) { ...@@ -236,8 +236,6 @@ func TestDynamoNimDeploymentReconciler_FinalizeResource(t *testing.T) {
func TestDynamoNimDeploymentReconciler_generateIngress(t *testing.T) { func TestDynamoNimDeploymentReconciler_generateIngress(t *testing.T) {
type fields struct { type fields struct {
IngressControllerClassName string
IstioVirtualServiceEnabled bool
} }
type args struct { type args struct {
ctx context.Context ctx context.Context
...@@ -253,10 +251,7 @@ func TestDynamoNimDeploymentReconciler_generateIngress(t *testing.T) { ...@@ -253,10 +251,7 @@ func TestDynamoNimDeploymentReconciler_generateIngress(t *testing.T) {
}{ }{
{ {
name: "generate ingress", name: "generate ingress",
fields: fields{ fields: fields{},
IngressControllerClassName: "nginx",
IstioVirtualServiceEnabled: false,
},
args: args{ args: args{
ctx: context.Background(), ctx: context.Background(),
opt: generateResourceOption{ opt: generateResourceOption{
...@@ -271,6 +266,9 @@ func TestDynamoNimDeploymentReconciler_generateIngress(t *testing.T) { ...@@ -271,6 +266,9 @@ func TestDynamoNimDeploymentReconciler_generateIngress(t *testing.T) {
DynamoNamespace: &[]string{"default"}[0], DynamoNamespace: &[]string{"default"}[0],
Ingress: v1alpha1.IngressSpec{ Ingress: v1alpha1.IngressSpec{
Enabled: true, Enabled: true,
Host: "someservice",
IngressControllerClassName: &[]string{"nginx"}[0],
UseVirtualService: false,
}, },
}, },
}, },
...@@ -286,7 +284,7 @@ func TestDynamoNimDeploymentReconciler_generateIngress(t *testing.T) { ...@@ -286,7 +284,7 @@ func TestDynamoNimDeploymentReconciler_generateIngress(t *testing.T) {
IngressClassName: &[]string{"nginx"}[0], IngressClassName: &[]string{"nginx"}[0],
Rules: []networkingv1.IngressRule{ Rules: []networkingv1.IngressRule{
{ {
Host: "service1.local", Host: "someservice.local",
IngressRuleValue: networkingv1.IngressRuleValue{ IngressRuleValue: networkingv1.IngressRuleValue{
HTTP: &networkingv1.HTTPIngressRuleValue{ HTTP: &networkingv1.HTTPIngressRuleValue{
Paths: []networkingv1.HTTPIngressPath{ Paths: []networkingv1.HTTPIngressPath{
...@@ -312,10 +310,7 @@ func TestDynamoNimDeploymentReconciler_generateIngress(t *testing.T) { ...@@ -312,10 +310,7 @@ func TestDynamoNimDeploymentReconciler_generateIngress(t *testing.T) {
}, },
{ {
name: "generate ingress, disabled", name: "generate ingress, disabled",
fields: fields{ fields: fields{},
IngressControllerClassName: "nginx",
IstioVirtualServiceEnabled: false,
},
args: args{ args: args{
ctx: context.Background(), ctx: context.Background(),
opt: generateResourceOption{ opt: generateResourceOption{
...@@ -349,10 +344,7 @@ func TestDynamoNimDeploymentReconciler_generateIngress(t *testing.T) { ...@@ -349,10 +344,7 @@ func TestDynamoNimDeploymentReconciler_generateIngress(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
g := gomega.NewGomegaWithT(t) g := gomega.NewGomegaWithT(t)
r := &DynamoNimDeploymentReconciler{ r := &DynamoNimDeploymentReconciler{}
IngressControllerClassName: tt.fields.IngressControllerClassName,
IstioVirtualServiceEnabled: tt.fields.IstioVirtualServiceEnabled,
}
got, got1, err := r.generateIngress(tt.args.ctx, tt.args.opt) got, got1, err := r.generateIngress(tt.args.ctx, tt.args.opt)
if (err != nil) != tt.wantErr { if (err != nil) != tt.wantErr {
t.Errorf("DynamoNimDeploymentReconciler.generateIngress() error = %v, wantErr %v", err, tt.wantErr) t.Errorf("DynamoNimDeploymentReconciler.generateIngress() error = %v, wantErr %v", err, tt.wantErr)
...@@ -366,8 +358,6 @@ func TestDynamoNimDeploymentReconciler_generateIngress(t *testing.T) { ...@@ -366,8 +358,6 @@ func TestDynamoNimDeploymentReconciler_generateIngress(t *testing.T) {
func TestDynamoNimDeploymentReconciler_generateVirtualService(t *testing.T) { func TestDynamoNimDeploymentReconciler_generateVirtualService(t *testing.T) {
type fields struct { type fields struct {
IngressControllerClassName string
IstioVirtualServiceEnabled bool
} }
type args struct { type args struct {
ctx context.Context ctx context.Context
...@@ -383,10 +373,7 @@ func TestDynamoNimDeploymentReconciler_generateVirtualService(t *testing.T) { ...@@ -383,10 +373,7 @@ func TestDynamoNimDeploymentReconciler_generateVirtualService(t *testing.T) {
}{ }{
{ {
name: "generate virtual service, disabled in operator config", name: "generate virtual service, disabled in operator config",
fields: fields{ fields: fields{},
IngressControllerClassName: "",
IstioVirtualServiceEnabled: false,
},
args: args{ args: args{
ctx: context.Background(), ctx: context.Background(),
opt: generateResourceOption{ opt: generateResourceOption{
...@@ -418,10 +405,7 @@ func TestDynamoNimDeploymentReconciler_generateVirtualService(t *testing.T) { ...@@ -418,10 +405,7 @@ func TestDynamoNimDeploymentReconciler_generateVirtualService(t *testing.T) {
}, },
{ {
name: "generate virtual service, enabled in operator config", name: "generate virtual service, enabled in operator config",
fields: fields{ fields: fields{},
IngressControllerClassName: "",
IstioVirtualServiceEnabled: true,
},
args: args{ args: args{
ctx: context.Background(), ctx: context.Background(),
opt: generateResourceOption{ opt: generateResourceOption{
...@@ -436,6 +420,9 @@ func TestDynamoNimDeploymentReconciler_generateVirtualService(t *testing.T) { ...@@ -436,6 +420,9 @@ func TestDynamoNimDeploymentReconciler_generateVirtualService(t *testing.T) {
DynamoNamespace: &[]string{"default"}[0], DynamoNamespace: &[]string{"default"}[0],
Ingress: v1alpha1.IngressSpec{ Ingress: v1alpha1.IngressSpec{
Enabled: true, Enabled: true,
Host: "someservice",
UseVirtualService: true,
VirtualServiceGateway: &[]string{"istio-system/ingress-alb"}[0],
}, },
}, },
}, },
...@@ -448,7 +435,7 @@ func TestDynamoNimDeploymentReconciler_generateVirtualService(t *testing.T) { ...@@ -448,7 +435,7 @@ func TestDynamoNimDeploymentReconciler_generateVirtualService(t *testing.T) {
Namespace: "default", Namespace: "default",
}, },
Spec: istioNetworking.VirtualService{ Spec: istioNetworking.VirtualService{
Hosts: []string{"service1.local"}, Hosts: []string{"someservice.local"},
Gateways: []string{"istio-system/ingress-alb"}, Gateways: []string{"istio-system/ingress-alb"},
Http: []*istioNetworking.HTTPRoute{ Http: []*istioNetworking.HTTPRoute{
{ {
...@@ -480,10 +467,7 @@ func TestDynamoNimDeploymentReconciler_generateVirtualService(t *testing.T) { ...@@ -480,10 +467,7 @@ func TestDynamoNimDeploymentReconciler_generateVirtualService(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
g := gomega.NewGomegaWithT(t) g := gomega.NewGomegaWithT(t)
r := &DynamoNimDeploymentReconciler{ r := &DynamoNimDeploymentReconciler{}
IngressControllerClassName: tt.fields.IngressControllerClassName,
IstioVirtualServiceEnabled: tt.fields.IstioVirtualServiceEnabled,
}
got, got1, err := r.generateVirtualService(tt.args.ctx, tt.args.opt) got, got1, err := r.generateVirtualService(tt.args.ctx, tt.args.opt)
if (err != nil) != tt.wantErr { if (err != nil) != tt.wantErr {
t.Errorf("DynamoNimDeploymentReconciler.generateVirtualService() error = %v, wantErr %v", err, tt.wantErr) t.Errorf("DynamoNimDeploymentReconciler.generateVirtualService() error = %v, wantErr %v", err, tt.wantErr)
......
...@@ -233,7 +233,7 @@ func GetDynamoNIMConfig(ctx context.Context, dynamoDeployment *v1alpha1.DynamoDe ...@@ -233,7 +233,7 @@ func GetDynamoNIMConfig(ctx context.Context, dynamoDeployment *v1alpha1.DynamoDe
} }
// generate DynamoNIMDeployment from config // generate DynamoNIMDeployment from config
func GenerateDynamoNIMDeployments(ctx context.Context, parentDynamoDeployment *v1alpha1.DynamoDeployment, config *DynamoNIMConfig) (map[string]*v1alpha1.DynamoNimDeployment, error) { func GenerateDynamoNIMDeployments(ctx context.Context, parentDynamoDeployment *v1alpha1.DynamoDeployment, config *DynamoNIMConfig, ingressSpec *v1alpha1.IngressSpec) (map[string]*v1alpha1.DynamoNimDeployment, error) {
dynamoServices := make(map[string]string) dynamoServices := make(map[string]string)
deployments := make(map[string]*v1alpha1.DynamoNimDeployment) deployments := make(map[string]*v1alpha1.DynamoNimDeployment)
for _, service := range config.Services { for _, service := range config.Services {
...@@ -255,7 +255,7 @@ func GenerateDynamoNIMDeployments(ctx context.Context, parentDynamoDeployment *v ...@@ -255,7 +255,7 @@ func GenerateDynamoNIMDeployments(ctx context.Context, parentDynamoDeployment *v
// dynamo is not enabled // dynamo is not enabled
if config.EntryService == service.Name { if config.EntryService == service.Name {
// enable virtual service for the entry service // enable virtual service for the entry service
deployment.Spec.Ingress.Enabled = true deployment.Spec.Ingress = *ingressSpec
} }
} }
if service.Config.Resources != nil { if service.Config.Resources != nil {
......
...@@ -31,6 +31,7 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) { ...@@ -31,6 +31,7 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) {
type args struct { type args struct {
parentDynamoDeployment *v1alpha1.DynamoDeployment parentDynamoDeployment *v1alpha1.DynamoDeployment
config *DynamoNIMConfig config *DynamoNIMConfig
ingressSpec *v1alpha1.IngressSpec
} }
tests := []struct { tests := []struct {
name string name string
...@@ -85,6 +86,7 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) { ...@@ -85,6 +86,7 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) {
}, },
}, },
}, },
ingressSpec: &v1alpha1.IngressSpec{},
}, },
want: map[string]*v1alpha1.DynamoNimDeployment{ want: map[string]*v1alpha1.DynamoNimDeployment{
"service1": { "service1": {
...@@ -190,6 +192,10 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) { ...@@ -190,6 +192,10 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) {
}, },
}, },
}, },
ingressSpec: &v1alpha1.IngressSpec{
Enabled: true,
Host: "test-dynamodeployment",
},
}, },
want: map[string]*v1alpha1.DynamoNimDeployment{ want: map[string]*v1alpha1.DynamoNimDeployment{
"service1": { "service1": {
...@@ -229,6 +235,7 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) { ...@@ -229,6 +235,7 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) {
}, },
Ingress: v1alpha1.IngressSpec{ Ingress: v1alpha1.IngressSpec{
Enabled: true, Enabled: true,
Host: "test-dynamodeployment",
}, },
}, },
}, },
...@@ -297,6 +304,7 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) { ...@@ -297,6 +304,7 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) {
}, },
}, },
}, },
ingressSpec: &v1alpha1.IngressSpec{},
}, },
want: map[string]*v1alpha1.DynamoNimDeployment{ want: map[string]*v1alpha1.DynamoNimDeployment{
"service1": { "service1": {
...@@ -334,9 +342,7 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) { ...@@ -334,9 +342,7 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) {
DeploymentSelectorValue: "service2/dynamo-test-dynamodeployment", DeploymentSelectorValue: "service2/dynamo-test-dynamodeployment",
}, },
}, },
Ingress: v1alpha1.IngressSpec{ Ingress: v1alpha1.IngressSpec{},
Enabled: true,
},
}, },
}, },
}, },
...@@ -409,6 +415,7 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) { ...@@ -409,6 +415,7 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) {
}, },
}, },
}, },
ingressSpec: &v1alpha1.IngressSpec{},
}, },
wantErr: true, wantErr: true,
}, },
...@@ -416,7 +423,7 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) { ...@@ -416,7 +423,7 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
g := gomega.NewGomegaWithT(t) g := gomega.NewGomegaWithT(t)
got, err := GenerateDynamoNIMDeployments(context.Background(), tt.args.parentDynamoDeployment, tt.args.config) got, err := GenerateDynamoNIMDeployments(context.Background(), tt.args.parentDynamoDeployment, tt.args.config, tt.args.ingressSpec)
if (err != nil) != tt.wantErr { if (err != nil) != tt.wantErr {
t.Errorf("GenerateDynamoNIMDeployments() error = %v, wantErr %v", err, tt.wantErr) t.Errorf("GenerateDynamoNIMDeployments() error = %v, wantErr %v", err, tt.wantErr)
return return
......
...@@ -19,6 +19,8 @@ from __future__ import annotations ...@@ -19,6 +19,8 @@ from __future__ import annotations
import json import json
import logging import logging
import re
import sys
import typing as t import typing as t
from http import HTTPStatus from http import HTTPStatus
...@@ -50,7 +52,7 @@ else: ...@@ -50,7 +52,7 @@ else:
def raise_deployment_config_error(err: BentoMLException, action: str) -> t.NoReturn: def raise_deployment_config_error(err: BentoMLException, action: str) -> t.NoReturn:
if err.error_code == HTTPStatus.UNAUTHORIZED: if err.error_code == HTTPStatus.UNAUTHORIZED:
raise BentoMLException( raise BentoMLException(
f"{err}\n* BentoCloud API token is required for authorization. Run `bentoml cloud login` command to login" f"{err}\n* Dynamo Cloud API token is required for authorization. Run `dynamo cloud login` command to login"
) from None ) from None
raise BentoMLException( raise BentoMLException(
f"Failed to {action} deployment due to invalid configuration: {err}" f"Failed to {action} deployment due to invalid configuration: {err}"
...@@ -161,7 +163,7 @@ def build_deployment_command() -> click.Group: ...@@ -161,7 +163,7 @@ def build_deployment_command() -> click.Group:
wait: bool, wait: bool,
timeout: int, timeout: int,
) -> None: ) -> None:
"""Create a deployment on BentoCloud. """Create a deployment on Dynamo Cloud.
\b \b
Create a deployment using parameters, or using config yaml file. Create a deployment using parameters, or using config yaml file.
...@@ -175,6 +177,74 @@ def build_deployment_command() -> click.Group: ...@@ -175,6 +177,74 @@ def build_deployment_command() -> click.Group:
args=ctx.args, args=ctx.args,
) )
@deployment_command.command()
@click.argument("name", type=click.STRING)
@click.option(
"--cluster",
type=click.STRING,
help="Cluster name",
default=None,
)
def get(name: str, cluster: str | None) -> None:
"""Get deployment details from Dynamo Cloud.
\b
Get deployment details by name.
"""
get_deployment(name, cluster=cluster)
@deployment_command.command()
@click.option(
"--cluster",
type=click.STRING,
help="Cluster name",
default=None,
)
@click.option(
"--search",
type=click.STRING,
help="Search query",
default=None,
)
@click.option(
"--dev",
is_flag=True,
help="List development deployments",
default=False,
)
@click.option(
"-q",
"--query",
type=click.STRING,
help="Advanced query string",
default=None,
)
def list(
cluster: str | None, search: str | None, dev: bool, query: str | None
) -> None:
"""List all deployments from Dynamo Cloud.
\b
List and filter deployments.
"""
list_deployments(cluster=cluster, search=search, dev=dev, q=query)
@deployment_command.command()
@click.argument("name", type=click.STRING)
@click.option(
"--cluster",
type=click.STRING,
help="Cluster name",
default=None,
)
def delete(name: str, cluster: str | None) -> None:
"""Delete a deployment from Dynamo Cloud.
\b
Delete deployment by name.
"""
delete_deployment(name, cluster=cluster)
return deployment_command return deployment_command
...@@ -213,23 +283,125 @@ def create_deployment( ...@@ -213,23 +283,125 @@ def create_deployment(
try: try:
config_params.verify() config_params.verify()
except BentoMLException as e: except BentoMLException as e:
raise_deployment_config_error(e, "create") print(f"Error: {str(e)}")
sys.exit(1)
console = Console(highlight=False) console = Console(highlight=False)
with Spinner(console=console) as spinner: with Spinner(console=console) as spinner:
spinner.update("Creating deployment on BentoCloud") spinner.update("Creating deployment on Dynamo Cloud")
try:
deployment = _cloud_client.deployment.create( deployment = _cloud_client.deployment.create(
deployment_config_params=config_params deployment_config_params=config_params
) )
spinner.log( spinner.log(
f':white_check_mark: Created deployment "{deployment.name}" in cluster "{deployment.cluster}"' f':white_check_mark: Created deployment "{deployment.name}" in cluster "{deployment.cluster}"'
) )
spinner.log(f":laptop_computer: View Dashboard: {deployment.admin_console}")
if wait: if wait:
spinner.update( spinner.update(
"[bold blue]Waiting for deployment to be ready, you can use --no-wait to skip this process[/]", "[bold blue]Waiting for deployment to be ready, you can use --no-wait to skip this process[/]",
) )
retcode = deployment.wait_until_ready(timeout=timeout, spinner=spinner) retcode = deployment.wait_until_ready(timeout=timeout, spinner=spinner)
if retcode != 0: if retcode != 0:
raise SystemExit(retcode) sys.exit(retcode)
return deployment
except BentoMLException as e:
error_msg = str(e)
if "already exists" in error_msg:
# Extract deployment name from error message and clean it
match = re.search(r'"([^"]+?)(?:\\+)?" already exists', error_msg)
dep_name = match.group(1).rstrip("\\") if match else name
error_msg = (
f'Error: Deployment "{dep_name}" already exists. To create a new deployment:\n'
f"1. Use a different name with the --name flag\n"
f"2. Or delete the existing deployment with: dynamo deployment delete {dep_name}"
)
print(error_msg)
sys.exit(1)
print(f"Error: {str(e)}")
sys.exit(1)
@inject
def get_deployment(
name: str,
cluster: str | None = None,
_cloud_client: BentoCloudClient = Provide[BentoMLContainer.bentocloud_client],
) -> Deployment:
"""Get deployment details from Dynamo Cloud."""
console = Console(highlight=False)
with Spinner(console=console) as spinner:
spinner.update(f'Getting deployment "{name}" from Dynamo Cloud')
try:
deployment = _cloud_client.deployment.get(name=name, cluster=cluster)
spinner.log(
f':white_check_mark: Found deployment "{deployment.name}" in cluster "{deployment.cluster}"'
)
return deployment return deployment
except BentoMLException as e:
if "No cloud context default found" in str(e):
raise BentoMLException(
"Not logged in to Dynamo Cloud. Please run 'dynamo cloud login' first."
) from None
raise_deployment_config_error(e, "get")
@inject
def delete_deployment(
name: str,
cluster: str | None = None,
_cloud_client: BentoCloudClient = Provide[BentoMLContainer.bentocloud_client],
) -> None:
"""Delete a deployment from Dynamo Cloud."""
console = Console(highlight=False)
with Spinner(console=console) as spinner:
spinner.update(f'Deleting deployment "{name}" from Dynamo Cloud')
try:
_cloud_client.deployment.delete(name=name, cluster=cluster)
spinner.log(f':white_check_mark: Deleted deployment "{name}"')
except BentoMLException as e:
if "No cloud context default found" in str(e):
raise BentoMLException(
"Not logged in to Dynamo Cloud. Please run 'dynamo cloud login' first."
) from None
raise_deployment_config_error(e, "delete")
@inject
def list_deployments(
cluster: str | None = None,
search: str | None = None,
dev: bool = False,
q: str | None = None,
labels: t.List[dict[str, t.Any]] | None = None,
_cloud_client: BentoCloudClient = Provide[BentoMLContainer.bentocloud_client],
) -> None:
"""List all deployments from Dynamo Cloud."""
console = Console(highlight=False)
with Spinner(console=console) as spinner:
spinner.update("Getting all deployments from Dynamo Cloud")
try:
# Handle label-based filtering
if labels is not None:
label_query = " ".join(f"label:{d['key']}={d['value']}" for d in labels)
if q is not None:
q = f"{q} {label_query}"
else:
q = label_query
deployments = _cloud_client.deployment.list(
cluster=cluster, search=search, dev=dev, q=q
)
if not deployments:
spinner.log("No deployments found")
return
spinner.log(":white_check_mark: Found deployments:")
for deployment in deployments:
spinner.log(f" • {deployment.name} (cluster: {deployment.cluster})")
except BentoMLException as e:
if "No cloud context default found" in str(e):
raise BentoMLException(
"Not logged in to Dynamo Cloud. Please run 'dynamo cloud login' first."
) from None
raise_deployment_config_error(e, "list")
...@@ -86,10 +86,30 @@ export DEPLOYMENT_NAME=hello-world ...@@ -86,10 +86,30 @@ export DEPLOYMENT_NAME=hello-world
dynamo deployment create $DYNAMO_TAG --no-wait -n $DEPLOYMENT_NAME dynamo deployment create $DYNAMO_TAG --no-wait -n $DEPLOYMENT_NAME
``` ```
To delete an existing deployment: #### Managing Deployments
Once you have deployments running, you can manage them using the following commands:
To see a list of all deployments in your namespace:
```bash
dynamo deployment list
```
This command displays a table of all deployments.
To get detailed information about a specific deployment:
```bash
dynamo deployment get $DEPLOYMENT_NAME
```
To remove a deployment and all its associated resources:
```bash ```bash
kubectl delete dynamodeployment $DEPLOYMENT_NAME dynamo deployment delete $DEPLOYMENT_NAME
``` ```
> [!WARNING]
> This command will permanently delete the deployment and all associated resources. Make sure you have any necessary backups before proceeding.
### 4. Test the Deployment ### 4. Test the Deployment
......
...@@ -156,7 +156,7 @@ export DYNAMO_IMAGE=<dynamo_docker_image_name> ...@@ -156,7 +156,7 @@ export DYNAMO_IMAGE=<dynamo_docker_image_name>
# Prepare your project for deployment. # Prepare your project for deployment.
cd $PROJECT_ROOT/examples/hello_world cd $PROJECT_ROOT/examples/hello_world
DYNAMO_TAG=$(dynamo build hello_world:Frontend | grep "Successfully built" | awk -F"\"" '{ print $2 }') DYNAMO_TAG=$(dynamo build hello_world:Frontend | grep "Successfully built" | awk '{ print $3 }' | sed 's/\.$//')
``` ```
3. **Deploy to Kubernetes** 3. **Deploy to Kubernetes**
...@@ -167,12 +167,6 @@ export HELM_RELEASE=ci-hw ...@@ -167,12 +167,6 @@ export HELM_RELEASE=ci-hw
dynamo deployment create $DYNAMO_TAG --no-wait -n $HELM_RELEASE dynamo deployment create $DYNAMO_TAG --no-wait -n $HELM_RELEASE
``` ```
To delete an existing Dynamo deployment:
```bash
kubectl delete dynamodeployment $HELM_RELEASE
```
4. **Test the deployment** 4. **Test the deployment**
Once you create the Dynamo deployment, a pod prefixed with `yatai-dynamonim-image-builder` will begin running. Once it finishes running, it will create the pods necessary. Once the pods prefixed with `$HELM_RELEASE` are up and running, you can test out your example! Once you create the Dynamo deployment, a pod prefixed with `yatai-dynamonim-image-builder` will begin running. Once it finishes running, it will create the pods necessary. Once the pods prefixed with `$HELM_RELEASE` are up and running, you can test out your example!
......
...@@ -210,12 +210,6 @@ export DEPLOYMENT_NAME=llm-agg ...@@ -210,12 +210,6 @@ export DEPLOYMENT_NAME=llm-agg
dynamo deployment create $DYNAMO_TAG --no-wait -n $DEPLOYMENT_NAME -f ./configs/agg.yaml dynamo deployment create $DYNAMO_TAG --no-wait -n $DEPLOYMENT_NAME -f ./configs/agg.yaml
``` ```
To delete an existing Dynamo deployment:
```bash
kubectl delete dynamodeployment $DEPLOYMENT_NAME
```
4. **Test the deployment** 4. **Test the deployment**
Once you create the Dynamo deployment, a pod prefixed with `yatai-dynamonim-image-builder` will begin running. Once it finishes running, pods will be created using the image that was built. Once the pods prefixed with `$DEPLOYMENT_NAME` are up and running, you can test out your example! Once you create the Dynamo deployment, a pod prefixed with `yatai-dynamonim-image-builder` will begin running. Once it finishes running, pods will be created using the image that was built. Once the pods prefixed with `$DEPLOYMENT_NAME` are up and running, you can test out your example!
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment