Просмотр исходного кода

add rest of provision handlers

Alexander Belanger 4 лет назад
Родитель
Сommit
0b48bed4a7

+ 104 - 0
api/server/handlers/provision/provision_docr.go

@@ -0,0 +1,104 @@
+package provision
+
+import (
+	"net/http"
+
+	"github.com/porter-dev/porter/api/server/handlers"
+	"github.com/porter-dev/porter/api/server/shared"
+	"github.com/porter-dev/porter/api/server/shared/apierrors"
+	"github.com/porter-dev/porter/api/server/shared/config"
+	"github.com/porter-dev/porter/api/types"
+	"github.com/porter-dev/porter/internal/kubernetes"
+	"github.com/porter-dev/porter/internal/kubernetes/provisioner"
+	"github.com/porter-dev/porter/internal/models"
+	"github.com/porter-dev/porter/internal/repository"
+	"gorm.io/gorm"
+)
+
+type ProvisionDOCRHandler struct {
+	handlers.PorterHandlerReadWriter
+}
+
+func NewProvisionDOCRHandler(
+	config *config.Config,
+	decoderValidator shared.RequestDecoderValidator,
+	writer shared.ResultWriter,
+) *ProvisionDOCRHandler {
+	return &ProvisionDOCRHandler{
+		PorterHandlerReadWriter: handlers.NewDefaultPorterHandler(config, decoderValidator, writer),
+	}
+}
+
+func (c *ProvisionDOCRHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+	// read the project from context
+	proj, _ := r.Context().Value(types.ProjectScope).(*models.Project)
+
+	request := &types.CreateDOCRInfraRequest{}
+
+	if ok := c.DecodeAndValidate(w, r, request); !ok {
+		return
+	}
+
+	// get the AWS integration
+	doInt, err := c.Repo().OAuthIntegration().ReadOAuthIntegration(proj.ID, request.DOIntegrationID)
+
+	if err != nil {
+		if err == gorm.ErrRecordNotFound {
+			c.HandleAPIError(w, r, apierrors.NewErrForbidden(err))
+		} else {
+			c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+		}
+
+		return
+	}
+
+	suffix, err := repository.GenerateRandomBytes(6)
+
+	if err != nil {
+		c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+		return
+	}
+
+	infra := &models.Infra{
+		Kind:            types.InfraDOCR,
+		ProjectID:       proj.ID,
+		Suffix:          suffix,
+		Status:          types.StatusCreating,
+		DOIntegrationID: request.DOIntegrationID,
+	}
+
+	// handle write to the database
+	infra, err = c.Repo().Infra().CreateInfra(infra)
+
+	if err != nil {
+		c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+		return
+	}
+
+	// launch provisioning pod
+	_, err = c.Config().ProvisionerAgent.ProvisionDOCR(
+		&kubernetes.SharedProvisionOpts{
+			ProjectID:           proj.ID,
+			Repo:                c.Repo(),
+			Infra:               infra,
+			Operation:           provisioner.Apply,
+			PGConf:              c.Config().DBConf,
+			RedisConf:           c.Config().RedisConf,
+			ProvImageTag:        c.Config().ServerConf.ProvisionerImageTag,
+			ProvImagePullSecret: c.Config().ServerConf.ProvisionerImagePullSecret,
+		},
+		doInt,
+		c.Config().DOConf,
+		request.DOCRName,
+		request.DOCRSubscriptionTier,
+	)
+
+	if err != nil {
+		infra.Status = types.StatusError
+		infra, _ = c.Repo().Infra().UpdateInfra(infra)
+		c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+		return
+	}
+
+	c.WriteResult(w, r, infra.ToInfraType())
+}

+ 104 - 0
api/server/handlers/provision/provision_doks.go

@@ -0,0 +1,104 @@
+package provision
+
+import (
+	"net/http"
+
+	"github.com/porter-dev/porter/api/server/handlers"
+	"github.com/porter-dev/porter/api/server/shared"
+	"github.com/porter-dev/porter/api/server/shared/apierrors"
+	"github.com/porter-dev/porter/api/server/shared/config"
+	"github.com/porter-dev/porter/api/types"
+	"github.com/porter-dev/porter/internal/kubernetes"
+	"github.com/porter-dev/porter/internal/kubernetes/provisioner"
+	"github.com/porter-dev/porter/internal/models"
+	"github.com/porter-dev/porter/internal/repository"
+	"gorm.io/gorm"
+)
+
+type ProvisionDOKSHandler struct {
+	handlers.PorterHandlerReadWriter
+}
+
+func NewProvisionDOKSHandler(
+	config *config.Config,
+	decoderValidator shared.RequestDecoderValidator,
+	writer shared.ResultWriter,
+) *ProvisionDOKSHandler {
+	return &ProvisionDOKSHandler{
+		PorterHandlerReadWriter: handlers.NewDefaultPorterHandler(config, decoderValidator, writer),
+	}
+}
+
+func (c *ProvisionDOKSHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+	// read the project from context
+	proj, _ := r.Context().Value(types.ProjectScope).(*models.Project)
+
+	request := &types.CreateDOKSInfraRequest{}
+
+	if ok := c.DecodeAndValidate(w, r, request); !ok {
+		return
+	}
+
+	// get the AWS integration
+	doInt, err := c.Repo().OAuthIntegration().ReadOAuthIntegration(proj.ID, request.DOIntegrationID)
+
+	if err != nil {
+		if err == gorm.ErrRecordNotFound {
+			c.HandleAPIError(w, r, apierrors.NewErrForbidden(err))
+		} else {
+			c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+		}
+
+		return
+	}
+
+	suffix, err := repository.GenerateRandomBytes(6)
+
+	if err != nil {
+		c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+		return
+	}
+
+	infra := &models.Infra{
+		Kind:            types.InfraDOKS,
+		ProjectID:       proj.ID,
+		Suffix:          suffix,
+		Status:          types.StatusCreating,
+		DOIntegrationID: request.DOIntegrationID,
+	}
+
+	// handle write to the database
+	infra, err = c.Repo().Infra().CreateInfra(infra)
+
+	if err != nil {
+		c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+		return
+	}
+
+	// launch provisioning pod
+	_, err = c.Config().ProvisionerAgent.ProvisionDOKS(
+		&kubernetes.SharedProvisionOpts{
+			ProjectID:           proj.ID,
+			Repo:                c.Repo(),
+			Infra:               infra,
+			Operation:           provisioner.Apply,
+			PGConf:              c.Config().DBConf,
+			RedisConf:           c.Config().RedisConf,
+			ProvImageTag:        c.Config().ServerConf.ProvisionerImageTag,
+			ProvImagePullSecret: c.Config().ServerConf.ProvisionerImagePullSecret,
+		},
+		doInt,
+		c.Config().DOConf,
+		request.DORegion,
+		request.DOKSName,
+	)
+
+	if err != nil {
+		infra.Status = types.StatusError
+		infra, _ = c.Repo().Infra().UpdateInfra(infra)
+		c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+		return
+	}
+
+	c.WriteResult(w, r, infra.ToInfraType())
+}

+ 101 - 0
api/server/handlers/provision/provision_gcr.go

@@ -0,0 +1,101 @@
+package provision
+
+import (
+	"net/http"
+
+	"github.com/porter-dev/porter/api/server/handlers"
+	"github.com/porter-dev/porter/api/server/shared"
+	"github.com/porter-dev/porter/api/server/shared/apierrors"
+	"github.com/porter-dev/porter/api/server/shared/config"
+	"github.com/porter-dev/porter/api/types"
+	"github.com/porter-dev/porter/internal/kubernetes"
+	"github.com/porter-dev/porter/internal/kubernetes/provisioner"
+	"github.com/porter-dev/porter/internal/models"
+	"github.com/porter-dev/porter/internal/repository"
+	"gorm.io/gorm"
+)
+
+type ProvisionGCRHandler struct {
+	handlers.PorterHandlerReadWriter
+}
+
+func NewProvisionGCRHandler(
+	config *config.Config,
+	decoderValidator shared.RequestDecoderValidator,
+	writer shared.ResultWriter,
+) *ProvisionGCRHandler {
+	return &ProvisionGCRHandler{
+		PorterHandlerReadWriter: handlers.NewDefaultPorterHandler(config, decoderValidator, writer),
+	}
+}
+
+func (c *ProvisionGCRHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+	// read the project from context
+	proj, _ := r.Context().Value(types.ProjectScope).(*models.Project)
+
+	request := &types.CreateGCRInfraRequest{}
+
+	if ok := c.DecodeAndValidate(w, r, request); !ok {
+		return
+	}
+
+	// get the AWS integration
+	gcpInt, err := c.Repo().GCPIntegration().ReadGCPIntegration(proj.ID, request.GCPIntegrationID)
+
+	if err != nil {
+		if err == gorm.ErrRecordNotFound {
+			c.HandleAPIError(w, r, apierrors.NewErrForbidden(err))
+		} else {
+			c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+		}
+
+		return
+	}
+
+	suffix, err := repository.GenerateRandomBytes(6)
+
+	if err != nil {
+		c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+		return
+	}
+
+	infra := &models.Infra{
+		Kind:             types.InfraGCR,
+		ProjectID:        proj.ID,
+		Suffix:           suffix,
+		Status:           types.StatusCreating,
+		GCPIntegrationID: request.GCPIntegrationID,
+	}
+
+	// handle write to the database
+	infra, err = c.Repo().Infra().CreateInfra(infra)
+
+	if err != nil {
+		c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+		return
+	}
+
+	// launch provisioning pod
+	_, err = c.Config().ProvisionerAgent.ProvisionGCR(
+		&kubernetes.SharedProvisionOpts{
+			ProjectID:           proj.ID,
+			Repo:                c.Repo(),
+			Infra:               infra,
+			Operation:           provisioner.Apply,
+			PGConf:              c.Config().DBConf,
+			RedisConf:           c.Config().RedisConf,
+			ProvImageTag:        c.Config().ServerConf.ProvisionerImageTag,
+			ProvImagePullSecret: c.Config().ServerConf.ProvisionerImagePullSecret,
+		},
+		gcpInt,
+	)
+
+	if err != nil {
+		infra.Status = types.StatusError
+		infra, _ = c.Repo().Infra().UpdateInfra(infra)
+		c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+		return
+	}
+
+	c.WriteResult(w, r, infra.ToInfraType())
+}

+ 102 - 0
api/server/handlers/provision/provision_gke.go

@@ -0,0 +1,102 @@
+package provision
+
+import (
+	"net/http"
+
+	"github.com/porter-dev/porter/api/server/handlers"
+	"github.com/porter-dev/porter/api/server/shared"
+	"github.com/porter-dev/porter/api/server/shared/apierrors"
+	"github.com/porter-dev/porter/api/server/shared/config"
+	"github.com/porter-dev/porter/api/types"
+	"github.com/porter-dev/porter/internal/kubernetes"
+	"github.com/porter-dev/porter/internal/kubernetes/provisioner"
+	"github.com/porter-dev/porter/internal/models"
+	"github.com/porter-dev/porter/internal/repository"
+	"gorm.io/gorm"
+)
+
+type ProvisionGKEHandler struct {
+	handlers.PorterHandlerReadWriter
+}
+
+func NewProvisionGKEHandler(
+	config *config.Config,
+	decoderValidator shared.RequestDecoderValidator,
+	writer shared.ResultWriter,
+) *ProvisionGKEHandler {
+	return &ProvisionGKEHandler{
+		PorterHandlerReadWriter: handlers.NewDefaultPorterHandler(config, decoderValidator, writer),
+	}
+}
+
+func (c *ProvisionGKEHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+	// read the project from context
+	proj, _ := r.Context().Value(types.ProjectScope).(*models.Project)
+
+	request := &types.CreateGKEInfraRequest{}
+
+	if ok := c.DecodeAndValidate(w, r, request); !ok {
+		return
+	}
+
+	// get the AWS integration
+	gcpInt, err := c.Repo().GCPIntegration().ReadGCPIntegration(proj.ID, request.GCPIntegrationID)
+
+	if err != nil {
+		if err == gorm.ErrRecordNotFound {
+			c.HandleAPIError(w, r, apierrors.NewErrForbidden(err))
+		} else {
+			c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+		}
+
+		return
+	}
+
+	suffix, err := repository.GenerateRandomBytes(6)
+
+	if err != nil {
+		c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+		return
+	}
+
+	infra := &models.Infra{
+		Kind:             types.InfraGKE,
+		ProjectID:        proj.ID,
+		Suffix:           suffix,
+		Status:           types.StatusCreating,
+		GCPIntegrationID: request.GCPIntegrationID,
+	}
+
+	// handle write to the database
+	infra, err = c.Repo().Infra().CreateInfra(infra)
+
+	if err != nil {
+		c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+		return
+	}
+
+	// launch provisioning pod
+	_, err = c.Config().ProvisionerAgent.ProvisionGKE(
+		&kubernetes.SharedProvisionOpts{
+			ProjectID:           proj.ID,
+			Repo:                c.Repo(),
+			Infra:               infra,
+			Operation:           provisioner.Apply,
+			PGConf:              c.Config().DBConf,
+			RedisConf:           c.Config().RedisConf,
+			ProvImageTag:        c.Config().ServerConf.ProvisionerImageTag,
+			ProvImagePullSecret: c.Config().ServerConf.ProvisionerImagePullSecret,
+		},
+		gcpInt,
+		request.GKEName,
+	)
+
+	if err != nil {
+		infra.Status = types.StatusError
+		infra, _ = c.Repo().Infra().UpdateInfra(infra)
+		c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+		return
+	}
+
+	c.WriteResult(w, r, infra.ToInfraType())
+}

+ 112 - 0
api/server/router/project.go

@@ -525,6 +525,118 @@ func getProjectRoutes(
 		Router:   r,
 	})
 
+	//  POST /api/projects/{project_id}/provision/docr -> provision.NewProvisionDOCRHandler
+	provisionDOCREndpoint := factory.NewAPIEndpoint(
+		&types.APIRequestMetadata{
+			Verb:   types.APIVerbCreate,
+			Method: types.HTTPVerbPost,
+			Path: &types.Path{
+				Parent:       basePath,
+				RelativePath: relPath + "/provision/docr",
+			},
+			Scopes: []types.PermissionScope{
+				types.UserScope,
+				types.ProjectScope,
+			},
+		},
+	)
+
+	provisionDOCRHandler := provision.NewProvisionDOCRHandler(
+		config,
+		factory.GetDecoderValidator(),
+		factory.GetResultWriter(),
+	)
+
+	routes = append(routes, &Route{
+		Endpoint: provisionDOCREndpoint,
+		Handler:  provisionDOCRHandler,
+		Router:   r,
+	})
+
+	//  POST /api/projects/{project_id}/provision/doks -> provision.NewProvisionDOKSHandler
+	provisionDOKSEndpoint := factory.NewAPIEndpoint(
+		&types.APIRequestMetadata{
+			Verb:   types.APIVerbCreate,
+			Method: types.HTTPVerbPost,
+			Path: &types.Path{
+				Parent:       basePath,
+				RelativePath: relPath + "/provision/doks",
+			},
+			Scopes: []types.PermissionScope{
+				types.UserScope,
+				types.ProjectScope,
+			},
+		},
+	)
+
+	provisionDOKSHandler := provision.NewProvisionDOCRHandler(
+		config,
+		factory.GetDecoderValidator(),
+		factory.GetResultWriter(),
+	)
+
+	routes = append(routes, &Route{
+		Endpoint: provisionDOKSEndpoint,
+		Handler:  provisionDOKSHandler,
+		Router:   r,
+	})
+
+	//  POST /api/projects/{project_id}/provision/gcr -> provision.NewProvisionGCRHandler
+	provisionGCREndpoint := factory.NewAPIEndpoint(
+		&types.APIRequestMetadata{
+			Verb:   types.APIVerbCreate,
+			Method: types.HTTPVerbPost,
+			Path: &types.Path{
+				Parent:       basePath,
+				RelativePath: relPath + "/provision/gcr",
+			},
+			Scopes: []types.PermissionScope{
+				types.UserScope,
+				types.ProjectScope,
+			},
+		},
+	)
+
+	provisionGCRHandler := provision.NewProvisionGCRHandler(
+		config,
+		factory.GetDecoderValidator(),
+		factory.GetResultWriter(),
+	)
+
+	routes = append(routes, &Route{
+		Endpoint: provisionGCREndpoint,
+		Handler:  provisionGCRHandler,
+		Router:   r,
+	})
+
+	//  POST /api/projects/{project_id}/provision/gke -> provision.NewProvisionGKEHandler
+	provisionGKEEndpoint := factory.NewAPIEndpoint(
+		&types.APIRequestMetadata{
+			Verb:   types.APIVerbCreate,
+			Method: types.HTTPVerbPost,
+			Path: &types.Path{
+				Parent:       basePath,
+				RelativePath: relPath + "/provision/gke",
+			},
+			Scopes: []types.PermissionScope{
+				types.UserScope,
+				types.ProjectScope,
+			},
+		},
+	)
+
+	provisionGKEHandler := provision.NewProvisionGKEHandler(
+		config,
+		factory.GetDecoderValidator(),
+		factory.GetResultWriter(),
+	)
+
+	routes = append(routes, &Route{
+		Endpoint: provisionGKEEndpoint,
+		Handler:  provisionGKEHandler,
+		Router:   r,
+	})
+
 	// GET /api/projects/{project_id}/invites -> invite.NewInvitesListHandler
 	listInvitesEndpoint := factory.NewAPIEndpoint(
 		&types.APIRequestMetadata{

+ 5 - 5
docs/developing/backend-refactor-status.md

@@ -104,13 +104,13 @@
 | <li>- [X] `GET /api/projects/{project_id}/k8s/{namespace}/{name}/jobs/status`                                               | AB          |                 |             |                  |
 | <li>- [X] `GET /api/projects/{project_id}/k8s/{namespace}/{chart}/{release_name}/jobs`                                      | AB          |                 |             |                  |
 | <li>- [x] `GET /api/projects/{project_id}/policy`                                                                           | AS          |                 |             | yes              |
-| <li>- [ ] `POST /api/projects/{project_id}/provision/docr`                                                                  |             |                 |             |                  |
-| <li>- [ ] `POST /api/projects/{project_id}/provision/doks`                                                                  |             |                 |             |                  |
+| <li>- [X] `POST /api/projects/{project_id}/provision/docr`                                                                  | AB          |                 |             |                  |
+| <li>- [X] `POST /api/projects/{project_id}/provision/doks`                                                                  | AB          |                 |             |                  |
 | <li>- [X] `POST /api/projects/{project_id}/provision/ecr`                                                                   | AB          |                 |             |                  |
 | <li>- [X] `POST /api/projects/{project_id}/provision/eks`                                                                   | AB          |                 |             |                  |
-| <li>- [ ] `POST /api/projects/{project_id}/provision/gcr`                                                                   |             |                 |             |                  |
-| <li>- [ ] `POST /api/projects/{project_id}/provision/gke`                                                                   |             |                 |             |                  |
-| <li>- [ ] `POST /api/projects/{project_id}/provision/test`                                                                  |             |                 |             |                  |
+| <li>- [X] `POST /api/projects/{project_id}/provision/gcr`                                                                   | AB          |                 |             |                  |
+| <li>- [X] `POST /api/projects/{project_id}/provision/gke`                                                                   | AB          |                 |             |                  |
+| <li>- [X] `POST /api/projects/{project_id}/provision/test`                                                                  | N/A         |                 |             |                  |
 | <li>- [ ] `GET /api/projects/{project_id}/provision/{kind}/{infra_id}/logs`                                                 |             |                 |             |                  |
 | <li>- [X] `POST /api/projects/{project_id}/registries`                                                                      | AB          |                 |             |                  |
 | <li>- [X] `GET /api/projects/{project_id}/registries`                                                                       | AB          |                 |             |                  |