Skip to content

Commit

Permalink
feat: allow to set an alias and view them (#2385)
Browse files Browse the repository at this point in the history
  • Loading branch information
h4ck3rk3y committed Apr 22, 2024
1 parent 254b2ef commit 97e5c7d
Show file tree
Hide file tree
Showing 13 changed files with 2,246 additions and 1,291 deletions.
2,656 changes: 1,595 additions & 1,061 deletions api/typescript/src/engine/rest_api_bindings/types.d.ts

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Expand Up @@ -28,6 +28,7 @@ service KurtosisEnclaveManagerServer {
rpc GetCloudInstanceConfig(google.protobuf.Empty) returns (kurtosis_cloud.GetCloudInstanceConfigResponse) {};
rpc LockPort(LockUnlockPortRequest) returns (google.protobuf.Empty) {}
rpc UnlockPort(LockUnlockPortRequest) returns(google.protobuf.Empty) {}
rpc AddAlias(AddAliasRequest) returns(google.protobuf.Empty){}
}

message HealthCheckRequest {
Expand Down Expand Up @@ -94,6 +95,13 @@ message LockUnlockPortRequest {
string enclave_short_uuid=4;
}

message AddAliasRequest {
string alias=1;
uint32 port_number=2;
string service_short_uuid=3;
string enclave_short_uuid=4;
}


// ==============================================================================================
// Get Starlark Plan Yaml
Expand Down
Expand Up @@ -3,7 +3,7 @@
/* eslint-disable */
// @ts-nocheck

import { CreateRepositoryWebhookRequest, DownloadFilesArtifactRequest, GetListFilesArtifactNamesAndUuidsRequest, GetServicesRequest, GetStarlarkRunRequest, HealthCheckRequest, HealthCheckResponse, InspectFilesArtifactContentsRequest, LockUnlockPortRequest, RunStarlarkPackageRequest, RunStarlarkScriptRequest, StarlarkPackagePlanYamlArgs, StarlarkScriptPlanYamlArgs } from "./kurtosis_enclave_manager_api_pb.js";
import { AddAliasRequest, CreateRepositoryWebhookRequest, DownloadFilesArtifactRequest, GetListFilesArtifactNamesAndUuidsRequest, GetServicesRequest, GetStarlarkRunRequest, HealthCheckRequest, HealthCheckResponse, InspectFilesArtifactContentsRequest, LockUnlockPortRequest, RunStarlarkPackageRequest, RunStarlarkScriptRequest, StarlarkPackagePlanYamlArgs, StarlarkScriptPlanYamlArgs } from "./kurtosis_enclave_manager_api_pb.js";
import { Empty, MethodKind } from "@bufbuild/protobuf";
import { CreateEnclaveArgs, CreateEnclaveResponse, DestroyEnclaveArgs, GetEnclavesResponse, GetServiceLogsArgs, GetServiceLogsResponse } from "./engine_service_pb.js";
import { GetServicesResponse, GetStarlarkRunResponse, InspectFilesArtifactContentsResponse, ListFilesArtifactNamesAndUuidsResponse, PlanYaml, StarlarkRunResponseLine, StreamedDataChunk } from "./api_container_service_pb.js";
Expand Down Expand Up @@ -177,6 +177,15 @@ export const KurtosisEnclaveManagerServer = {
O: Empty,
kind: MethodKind.Unary,
},
/**
* @generated from rpc kurtosis_enclave_manager.KurtosisEnclaveManagerServer.AddAlias
*/
addAlias: {
name: "AddAlias",
I: AddAliasRequest,
O: Empty,
kind: MethodKind.Unary,
},
}
} as const;

Expand Up @@ -532,6 +532,61 @@ export class LockUnlockPortRequest extends Message<LockUnlockPortRequest> {
}
}

/**
* @generated from message kurtosis_enclave_manager.AddAliasRequest
*/
export class AddAliasRequest extends Message<AddAliasRequest> {
/**
* @generated from field: string alias = 1;
*/
alias = "";

/**
* @generated from field: uint32 port_number = 2;
*/
portNumber = 0;

/**
* @generated from field: string service_short_uuid = 3;
*/
serviceShortUuid = "";

/**
* @generated from field: string enclave_short_uuid = 4;
*/
enclaveShortUuid = "";

constructor(data?: PartialMessage<AddAliasRequest>) {
super();
proto3.util.initPartial(data, this);
}

static readonly runtime: typeof proto3 = proto3;
static readonly typeName = "kurtosis_enclave_manager.AddAliasRequest";
static readonly fields: FieldList = proto3.util.newFieldList(() => [
{ no: 1, name: "alias", kind: "scalar", T: 9 /* ScalarType.STRING */ },
{ no: 2, name: "port_number", kind: "scalar", T: 13 /* ScalarType.UINT32 */ },
{ no: 3, name: "service_short_uuid", kind: "scalar", T: 9 /* ScalarType.STRING */ },
{ no: 4, name: "enclave_short_uuid", kind: "scalar", T: 9 /* ScalarType.STRING */ },
]);

static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): AddAliasRequest {
return new AddAliasRequest().fromBinary(bytes, options);
}

static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): AddAliasRequest {
return new AddAliasRequest().fromJson(jsonValue, options);
}

static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): AddAliasRequest {
return new AddAliasRequest().fromJsonString(jsonString, options);
}

static equals(a: AddAliasRequest | PlainMessage<AddAliasRequest> | undefined, b: AddAliasRequest | PlainMessage<AddAliasRequest> | undefined): boolean {
return proto3.util.equals(AddAliasRequest, a, b);
}
}

/**
* ==============================================================================================
* Get Starlark Plan Yaml
Expand Down
67 changes: 58 additions & 9 deletions enclave-manager/server/server.go
Expand Up @@ -261,34 +261,37 @@ func (c *WebServer) GetServices(ctx context.Context, req *connect.Request[kurtos
if err != nil {
return nil, err
}
getUnlockedPortsRequest := &connect.Request[kurtosis_backend_server_rpc_api_bindings.GetUnlockedPortsRequest]{
Msg: &kurtosis_backend_server_rpc_api_bindings.GetUnlockedPortsRequest{
getUnlockedPortsRequest := &connect.Request[kurtosis_backend_server_rpc_api_bindings.GetPortsRequest]{
Msg: &kurtosis_backend_server_rpc_api_bindings.GetPortsRequest{
AccessToken: jwtToken,
InstanceShortUuid: instanceConfig.InstanceId[:shortUuidLength],
EnclaveShortUuid: req.Msg.EnclaveShortenedUuid,
},
}

var unlockedPortsAndServices []*kurtosis_backend_server_rpc_api_bindings.Port
getUnauthenticatedPortsResponse, err := (*cloudClient).GetUnlockedPorts(ctx, getUnlockedPortsRequest)
var portMetadata []*kurtosis_backend_server_rpc_api_bindings.CloudPort
cloudPortsResponse, err := (*cloudClient).GetPorts(ctx, getUnlockedPortsRequest)
if err != nil {
return nil, stacktrace.Propagate(err, "an error occurred while pulling unauthenticated ports from the cloud backend")
}
unlockedPortsAndServices = getUnauthenticatedPortsResponse.Msg.Port
portMetadata = cloudPortsResponse.Msg.CloudPorts

for _, service := range serviceInfoMapFromApicObj {
serviceShortUuid := service.ServiceUuid[:shortUuidLength]
for _, privatePort := range service.PrivatePorts {
locked := true
for _, unlockedPortsAndService := range unlockedPortsAndServices {
if unlockedPortsAndService.ServiceShortUuid == serviceShortUuid {
if privatePort.Number == unlockedPortsAndService.PortNumber {
locked = false
alias := ""
for _, unlockedPortsAndService := range portMetadata {
if unlockedPortsAndService.Port.ServiceShortUuid == serviceShortUuid {
if privatePort.Number == unlockedPortsAndService.Port.PortNumber {
locked = unlockedPortsAndService.Locked
alias = unlockedPortsAndService.Alias
break
}
}
}
privatePort.Locked = &locked
privatePort.Alias = &alias
}
}

Expand All @@ -301,6 +304,52 @@ func (c *WebServer) GetServices(ctx context.Context, req *connect.Request[kurtos
return resp, nil
}

func (c *WebServer) AddAlias(ctx context.Context, req *connect.Request[kurtosis_enclave_manager_api_bindings.AddAliasRequest]) (*connect.Response[emptypb.Empty], error) {
if !c.enforceAuth {
return nil, stacktrace.NewError("This method is only available in the cloud")
}
auth, instanceConfig, err := c.ValidateRequestAuthorization(ctx, c.enforceAuth, req.Header())
if err != nil {
return nil, stacktrace.Propagate(err, "Authentication attempt failed")
}
if !auth {
return nil, stacktrace.Propagate(err, "User not authorized")
}

cloudClient, err := c.createKurtosisCloudBackendClient(
kurtosisCloudApiHost,
kurtosisCloudApiPort,
)
if err != nil {
return nil, stacktrace.Propagate(err, "Failed to create the Cloud backend client")
}

jwtToken, err := extractJwtToken(req.Header())
if err != nil {
return nil, err
}
addAliasRequest := &connect.Request[kurtosis_backend_server_rpc_api_bindings.AddAliasRequest]{
Msg: &kurtosis_backend_server_rpc_api_bindings.AddAliasRequest{
AccessToken: jwtToken,
Port: &kurtosis_backend_server_rpc_api_bindings.Port{
InstanceShortUuid: instanceConfig.InstanceId[:shortUuidLength],
PortNumber: req.Msg.PortNumber,
EnclaveShortUuid: req.Msg.EnclaveShortUuid,
ServiceShortUuid: req.Msg.ServiceShortUuid,
},
Alias: req.Msg.Alias,
},
}

_, err = (*cloudClient).AddAlias(ctx, addAliasRequest)
if err != nil {
return nil, stacktrace.Propagate(err, "an error occurred while sending add alias request to the cloud backend")
}

return &connect.Response[emptypb.Empty]{}, nil

}

func (c *WebServer) LockPort(ctx context.Context, req *connect.Request[kurtosis_enclave_manager_api_bindings.LockUnlockPortRequest]) (*connect.Response[emptypb.Empty], error) {
if !c.enforceAuth {
return nil, stacktrace.NewError("This method is only available in the cloud")
Expand Down

0 comments on commit 97e5c7d

Please sign in to comment.