diff --git a/api/v1/environments.go b/api/v1/environments.go index bda481e..bf364c1 100644 --- a/api/v1/environments.go +++ b/api/v1/environments.go @@ -97,5 +97,39 @@ func (e *EnvironmentsServer) Get(ctx context.Context, in *proto.EnvironmentId) ( } func (e *EnvironmentsServer) List(in *empty.Empty, stream proto.Environments_ListServer) error { + md, ok := metadata.FromIncomingContext(stream.Context()) + if !ok { + return errors.New("metadata is not provided") + } + token, ok := md["token"] + if !ok { + return errors.New("token is not sent via metadata") + } + + uuid, ok := md["uuid"] + if !ok { + return errors.New("used id is not sent via metadata") + } + + environment := &controllers.Environemnt{ + UserID: uuid[0], + Controller: e.controller, + Token: token[0], + } + envs, err := environment.ListEnvs(stream.Context()) + if err != nil { + return err + } + + for _, env := range envs { + if err := stream.Send(&proto.EnvironmentFull{ + Id: &proto.EnvironmentId{Id: "test"}, + Data: &proto.EnvironmentData{ + Name: env, + }, + }); err != nil { + return err + } + } return nil } diff --git a/internal/controllers/accounts.go b/internal/controllers/accounts.go index e31a40a..e8c40ac 100644 --- a/internal/controllers/accounts.go +++ b/internal/controllers/accounts.go @@ -49,7 +49,7 @@ func (acc *Account) Create(ctx context.Context) error { Labels: map[string]string{ "username": acc.Data.Username, "email-verified": "false", - "managed-by": "softplayer", + "managed-by": "softplayer", }, }, } diff --git a/internal/controllers/environments.go b/internal/controllers/environments.go index a713903..8c4a9e0 100644 --- a/internal/controllers/environments.go +++ b/internal/controllers/environments.go @@ -13,6 +13,7 @@ import ( "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/rest" ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/client" ) type Environemnt struct { @@ -91,6 +92,7 @@ func (env *Environemnt) Create(ctx context.Context) error { Namespace: env.UserID, Labels: map[string]string{ "component": "bootstrap", + "kind": "environment", }, }, Data: map[string]string{ @@ -138,3 +140,34 @@ func (env *Environemnt) Delete(ctx context.Context) error { return nil } + +func (env *Environemnt) ListEnvs(ctx context.Context) ([]string, error) { + conf := &rest.Config{ + Host: "https://kubernetes.default.svc.cluster.local:443", + BearerToken: env.Token, + TLSClientConfig: rest.TLSClientConfig{ + Insecure: true, + }, + } + controller, err := ctrl.NewManager(conf, ctrl.Options{}) + if err != nil { + return []string{}, err + } + cms := corev1.ConfigMapList{} + cl := controller.GetClient() + + labels := client.MatchingLabels{ + "kind": "environment", + } + + ns := client.InNamespace(env.UserID) + if err := cl.List(ctx, &cms, labels, ns); err != nil { + return []string{}, err + } + + result := []string{} + for _, env := range cms.Items { + result = append(result, env.Name) + } + return result, nil +}