|
|
@@ -38,6 +38,7 @@ func (app *App) HandleProvisionTest(w http.ResponseWriter, r *http.Request) {
|
|
|
provisioner.Apply,
|
|
|
&app.DBConf,
|
|
|
app.RedisConf,
|
|
|
+ app.ServerConf.ProvisionerImageTag,
|
|
|
)
|
|
|
|
|
|
if err != nil {
|
|
|
@@ -74,7 +75,7 @@ func (app *App) HandleProvisionAWSECRInfra(w http.ResponseWriter, r *http.Reques
|
|
|
}
|
|
|
|
|
|
// convert the form to an aws infra instance
|
|
|
- infra, err := form.ToAWSInfra()
|
|
|
+ infra, err := form.ToInfra()
|
|
|
|
|
|
if err != nil {
|
|
|
app.handleErrorFormDecoding(err, ErrProjectDecode, w)
|
|
|
@@ -82,7 +83,7 @@ func (app *App) HandleProvisionAWSECRInfra(w http.ResponseWriter, r *http.Reques
|
|
|
}
|
|
|
|
|
|
// handle write to the database
|
|
|
- infra, err = app.Repo.AWSInfra.CreateAWSInfra(infra)
|
|
|
+ infra, err = app.Repo.Infra.CreateInfra(infra)
|
|
|
|
|
|
if err != nil {
|
|
|
app.handleErrorDataWrite(err, w)
|
|
|
@@ -93,7 +94,7 @@ func (app *App) HandleProvisionAWSECRInfra(w http.ResponseWriter, r *http.Reques
|
|
|
|
|
|
if err != nil {
|
|
|
infra.Status = models.StatusError
|
|
|
- infra, _ = app.Repo.AWSInfra.UpdateAWSInfra(infra)
|
|
|
+ infra, _ = app.Repo.Infra.UpdateInfra(infra)
|
|
|
|
|
|
app.handleErrorDataRead(err, w)
|
|
|
return
|
|
|
@@ -104,7 +105,7 @@ func (app *App) HandleProvisionAWSECRInfra(w http.ResponseWriter, r *http.Reques
|
|
|
|
|
|
if err != nil {
|
|
|
infra.Status = models.StatusError
|
|
|
- infra, _ = app.Repo.AWSInfra.UpdateAWSInfra(infra)
|
|
|
+ infra, _ = app.Repo.Infra.UpdateInfra(infra)
|
|
|
|
|
|
app.handleErrorDataRead(err, w)
|
|
|
return
|
|
|
@@ -118,11 +119,12 @@ func (app *App) HandleProvisionAWSECRInfra(w http.ResponseWriter, r *http.Reques
|
|
|
provisioner.Apply,
|
|
|
&app.DBConf,
|
|
|
app.RedisConf,
|
|
|
+ app.ServerConf.ProvisionerImageTag,
|
|
|
)
|
|
|
|
|
|
if err != nil {
|
|
|
infra.Status = models.StatusError
|
|
|
- infra, _ = app.Repo.AWSInfra.UpdateAWSInfra(infra)
|
|
|
+ infra, _ = app.Repo.Infra.UpdateInfra(infra)
|
|
|
|
|
|
app.handleErrorInternal(err, w)
|
|
|
return
|
|
|
@@ -151,7 +153,7 @@ func (app *App) HandleDestroyAWSECRInfra(w http.ResponseWriter, r *http.Request)
|
|
|
}
|
|
|
|
|
|
// read infra to get id
|
|
|
- infra, err := app.Repo.AWSInfra.ReadAWSInfra(uint(infraID))
|
|
|
+ infra, err := app.Repo.Infra.ReadInfra(uint(infraID))
|
|
|
|
|
|
if err != nil {
|
|
|
app.handleErrorDataRead(err, w)
|
|
|
@@ -165,7 +167,7 @@ func (app *App) HandleDestroyAWSECRInfra(w http.ResponseWriter, r *http.Request)
|
|
|
// decode from JSON to form value
|
|
|
if err := json.NewDecoder(r.Body).Decode(form); err != nil {
|
|
|
infra.Status = models.StatusError
|
|
|
- infra, _ = app.Repo.AWSInfra.UpdateAWSInfra(infra)
|
|
|
+ infra, _ = app.Repo.Infra.UpdateInfra(infra)
|
|
|
|
|
|
app.handleErrorFormDecoding(err, ErrProjectDecode, w)
|
|
|
return
|
|
|
@@ -174,7 +176,7 @@ func (app *App) HandleDestroyAWSECRInfra(w http.ResponseWriter, r *http.Request)
|
|
|
// validate the form
|
|
|
if err := app.validator.Struct(form); err != nil {
|
|
|
infra.Status = models.StatusError
|
|
|
- infra, _ = app.Repo.AWSInfra.UpdateAWSInfra(infra)
|
|
|
+ infra, _ = app.Repo.Infra.UpdateInfra(infra)
|
|
|
|
|
|
app.handleErrorFormValidation(err, ErrProjectValidateFields, w)
|
|
|
return
|
|
|
@@ -185,7 +187,7 @@ func (app *App) HandleDestroyAWSECRInfra(w http.ResponseWriter, r *http.Request)
|
|
|
|
|
|
if err != nil {
|
|
|
infra.Status = models.StatusError
|
|
|
- infra, _ = app.Repo.AWSInfra.UpdateAWSInfra(infra)
|
|
|
+ infra, _ = app.Repo.Infra.UpdateInfra(infra)
|
|
|
|
|
|
app.handleErrorDataRead(err, w)
|
|
|
return
|
|
|
@@ -193,7 +195,7 @@ func (app *App) HandleDestroyAWSECRInfra(w http.ResponseWriter, r *http.Request)
|
|
|
|
|
|
// mark infra for deletion
|
|
|
infra.Status = models.StatusDestroying
|
|
|
- infra, err = app.Repo.AWSInfra.UpdateAWSInfra(infra)
|
|
|
+ infra, err = app.Repo.Infra.UpdateInfra(infra)
|
|
|
|
|
|
if err != nil {
|
|
|
app.handleErrorDataWrite(err, w)
|
|
|
@@ -208,6 +210,7 @@ func (app *App) HandleDestroyAWSECRInfra(w http.ResponseWriter, r *http.Request)
|
|
|
provisioner.Destroy,
|
|
|
&app.DBConf,
|
|
|
app.RedisConf,
|
|
|
+ app.ServerConf.ProvisionerImageTag,
|
|
|
)
|
|
|
|
|
|
if err != nil {
|
|
|
@@ -246,7 +249,7 @@ func (app *App) HandleProvisionAWSEKSInfra(w http.ResponseWriter, r *http.Reques
|
|
|
}
|
|
|
|
|
|
// convert the form to an aws infra instance
|
|
|
- infra, err := form.ToAWSInfra()
|
|
|
+ infra, err := form.ToInfra()
|
|
|
|
|
|
if err != nil {
|
|
|
app.handleErrorFormDecoding(err, ErrProjectDecode, w)
|
|
|
@@ -254,7 +257,7 @@ func (app *App) HandleProvisionAWSEKSInfra(w http.ResponseWriter, r *http.Reques
|
|
|
}
|
|
|
|
|
|
// handle write to the database
|
|
|
- infra, err = app.Repo.AWSInfra.CreateAWSInfra(infra)
|
|
|
+ infra, err = app.Repo.Infra.CreateInfra(infra)
|
|
|
|
|
|
if err != nil {
|
|
|
app.handleErrorDataWrite(err, w)
|
|
|
@@ -265,7 +268,7 @@ func (app *App) HandleProvisionAWSEKSInfra(w http.ResponseWriter, r *http.Reques
|
|
|
|
|
|
if err != nil {
|
|
|
infra.Status = models.StatusError
|
|
|
- infra, _ = app.Repo.AWSInfra.UpdateAWSInfra(infra)
|
|
|
+ infra, _ = app.Repo.Infra.UpdateInfra(infra)
|
|
|
|
|
|
app.handleErrorDataRead(err, w)
|
|
|
return
|
|
|
@@ -276,7 +279,7 @@ func (app *App) HandleProvisionAWSEKSInfra(w http.ResponseWriter, r *http.Reques
|
|
|
|
|
|
if err != nil {
|
|
|
infra.Status = models.StatusError
|
|
|
- infra, _ = app.Repo.AWSInfra.UpdateAWSInfra(infra)
|
|
|
+ infra, _ = app.Repo.Infra.UpdateInfra(infra)
|
|
|
|
|
|
app.handleErrorDataRead(err, w)
|
|
|
return
|
|
|
@@ -290,11 +293,12 @@ func (app *App) HandleProvisionAWSEKSInfra(w http.ResponseWriter, r *http.Reques
|
|
|
provisioner.Apply,
|
|
|
&app.DBConf,
|
|
|
app.RedisConf,
|
|
|
+ app.ServerConf.ProvisionerImageTag,
|
|
|
)
|
|
|
|
|
|
if err != nil {
|
|
|
infra.Status = models.StatusError
|
|
|
- infra, _ = app.Repo.AWSInfra.UpdateAWSInfra(infra)
|
|
|
+ infra, _ = app.Repo.Infra.UpdateInfra(infra)
|
|
|
|
|
|
app.handleErrorInternal(err, w)
|
|
|
return
|
|
|
@@ -323,7 +327,7 @@ func (app *App) HandleDestroyAWSEKSInfra(w http.ResponseWriter, r *http.Request)
|
|
|
}
|
|
|
|
|
|
// read infra to get id
|
|
|
- infra, err := app.Repo.AWSInfra.ReadAWSInfra(uint(infraID))
|
|
|
+ infra, err := app.Repo.Infra.ReadInfra(uint(infraID))
|
|
|
|
|
|
if err != nil {
|
|
|
app.handleErrorDataRead(err, w)
|
|
|
@@ -337,7 +341,7 @@ func (app *App) HandleDestroyAWSEKSInfra(w http.ResponseWriter, r *http.Request)
|
|
|
// decode from JSON to form value
|
|
|
if err := json.NewDecoder(r.Body).Decode(form); err != nil {
|
|
|
infra.Status = models.StatusError
|
|
|
- infra, _ = app.Repo.AWSInfra.UpdateAWSInfra(infra)
|
|
|
+ infra, _ = app.Repo.Infra.UpdateInfra(infra)
|
|
|
|
|
|
app.handleErrorFormDecoding(err, ErrProjectDecode, w)
|
|
|
return
|
|
|
@@ -346,7 +350,7 @@ func (app *App) HandleDestroyAWSEKSInfra(w http.ResponseWriter, r *http.Request)
|
|
|
// validate the form
|
|
|
if err := app.validator.Struct(form); err != nil {
|
|
|
infra.Status = models.StatusError
|
|
|
- infra, _ = app.Repo.AWSInfra.UpdateAWSInfra(infra)
|
|
|
+ infra, _ = app.Repo.Infra.UpdateInfra(infra)
|
|
|
|
|
|
app.handleErrorFormValidation(err, ErrProjectValidateFields, w)
|
|
|
return
|
|
|
@@ -357,7 +361,7 @@ func (app *App) HandleDestroyAWSEKSInfra(w http.ResponseWriter, r *http.Request)
|
|
|
|
|
|
if err != nil {
|
|
|
infra.Status = models.StatusError
|
|
|
- infra, _ = app.Repo.AWSInfra.UpdateAWSInfra(infra)
|
|
|
+ infra, _ = app.Repo.Infra.UpdateInfra(infra)
|
|
|
|
|
|
app.handleErrorDataRead(err, w)
|
|
|
return
|
|
|
@@ -365,7 +369,7 @@ func (app *App) HandleDestroyAWSEKSInfra(w http.ResponseWriter, r *http.Request)
|
|
|
|
|
|
// mark infra for deletion
|
|
|
infra.Status = models.StatusDestroying
|
|
|
- infra, err = app.Repo.AWSInfra.UpdateAWSInfra(infra)
|
|
|
+ infra, err = app.Repo.Infra.UpdateInfra(infra)
|
|
|
|
|
|
if err != nil {
|
|
|
app.handleErrorDataWrite(err, w)
|
|
|
@@ -380,6 +384,7 @@ func (app *App) HandleDestroyAWSEKSInfra(w http.ResponseWriter, r *http.Request)
|
|
|
provisioner.Destroy,
|
|
|
&app.DBConf,
|
|
|
app.RedisConf,
|
|
|
+ app.ServerConf.ProvisionerImageTag,
|
|
|
)
|
|
|
|
|
|
if err != nil {
|
|
|
@@ -392,6 +397,272 @@ func (app *App) HandleDestroyAWSEKSInfra(w http.ResponseWriter, r *http.Request)
|
|
|
w.WriteHeader(http.StatusOK)
|
|
|
}
|
|
|
|
|
|
+// HandleProvisionGCPGCRInfra enables GCR for a project
|
|
|
+func (app *App) HandleProvisionGCPGCRInfra(w http.ResponseWriter, r *http.Request) {
|
|
|
+ projID, err := strconv.ParseUint(chi.URLParam(r, "project_id"), 0, 64)
|
|
|
+
|
|
|
+ if err != nil || projID == 0 {
|
|
|
+ app.handleErrorFormDecoding(err, ErrProjectDecode, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ form := &forms.CreateGCRInfra{
|
|
|
+ ProjectID: uint(projID),
|
|
|
+ }
|
|
|
+
|
|
|
+ // decode from JSON to form value
|
|
|
+ if err := json.NewDecoder(r.Body).Decode(form); err != nil {
|
|
|
+ app.handleErrorFormDecoding(err, ErrProjectDecode, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // validate the form
|
|
|
+ if err := app.validator.Struct(form); err != nil {
|
|
|
+ app.handleErrorFormValidation(err, ErrProjectValidateFields, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // convert the form to an aws infra instance
|
|
|
+ infra, err := form.ToInfra()
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ app.handleErrorFormDecoding(err, ErrProjectDecode, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // handle write to the database
|
|
|
+ infra, err = app.Repo.Infra.CreateInfra(infra)
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ app.handleErrorDataWrite(err, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ gcpInt, err := app.Repo.GCPIntegration.ReadGCPIntegration(infra.GCPIntegrationID)
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ infra.Status = models.StatusError
|
|
|
+ infra, _ = app.Repo.Infra.UpdateInfra(infra)
|
|
|
+
|
|
|
+ app.handleErrorDataRead(err, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // launch provisioning pod
|
|
|
+ agent, err := kubernetes.GetAgentInClusterConfig()
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ infra.Status = models.StatusError
|
|
|
+ infra, _ = app.Repo.Infra.UpdateInfra(infra)
|
|
|
+
|
|
|
+ app.handleErrorDataRead(err, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ _, err = agent.ProvisionGCR(
|
|
|
+ uint(projID),
|
|
|
+ gcpInt,
|
|
|
+ infra,
|
|
|
+ provisioner.Apply,
|
|
|
+ &app.DBConf,
|
|
|
+ app.RedisConf,
|
|
|
+ app.ServerConf.ProvisionerImageTag,
|
|
|
+ )
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ infra.Status = models.StatusError
|
|
|
+ infra, _ = app.Repo.Infra.UpdateInfra(infra)
|
|
|
+
|
|
|
+ app.handleErrorInternal(err, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ app.Logger.Info().Msgf("New gcp gcr infra created: %d", infra.ID)
|
|
|
+
|
|
|
+ w.WriteHeader(http.StatusCreated)
|
|
|
+
|
|
|
+ infraExt := infra.Externalize()
|
|
|
+
|
|
|
+ if err := json.NewEncoder(w).Encode(infraExt); err != nil {
|
|
|
+ app.handleErrorFormDecoding(err, ErrProjectDecode, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// HandleProvisionGCPGKEInfra provisions a new GKE instance for a project
|
|
|
+func (app *App) HandleProvisionGCPGKEInfra(w http.ResponseWriter, r *http.Request) {
|
|
|
+ projID, err := strconv.ParseUint(chi.URLParam(r, "project_id"), 0, 64)
|
|
|
+
|
|
|
+ if err != nil || projID == 0 {
|
|
|
+ app.handleErrorFormDecoding(err, ErrProjectDecode, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ form := &forms.CreateGKEInfra{
|
|
|
+ ProjectID: uint(projID),
|
|
|
+ }
|
|
|
+
|
|
|
+ // decode from JSON to form value
|
|
|
+ if err := json.NewDecoder(r.Body).Decode(form); err != nil {
|
|
|
+ app.handleErrorFormDecoding(err, ErrProjectDecode, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // validate the form
|
|
|
+ if err := app.validator.Struct(form); err != nil {
|
|
|
+ app.handleErrorFormValidation(err, ErrProjectValidateFields, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // convert the form to an aws infra instance
|
|
|
+ infra, err := form.ToInfra()
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ app.handleErrorFormDecoding(err, ErrProjectDecode, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // handle write to the database
|
|
|
+ infra, err = app.Repo.Infra.CreateInfra(infra)
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ app.handleErrorDataWrite(err, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ gcpInt, err := app.Repo.GCPIntegration.ReadGCPIntegration(infra.GCPIntegrationID)
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ infra.Status = models.StatusError
|
|
|
+ infra, _ = app.Repo.Infra.UpdateInfra(infra)
|
|
|
+
|
|
|
+ app.handleErrorDataRead(err, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // launch provisioning pod
|
|
|
+ agent, err := kubernetes.GetAgentInClusterConfig()
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ infra.Status = models.StatusError
|
|
|
+ infra, _ = app.Repo.Infra.UpdateInfra(infra)
|
|
|
+
|
|
|
+ app.handleErrorDataRead(err, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ _, err = agent.ProvisionGKE(
|
|
|
+ uint(projID),
|
|
|
+ gcpInt,
|
|
|
+ form.GKEName,
|
|
|
+ infra,
|
|
|
+ provisioner.Apply,
|
|
|
+ &app.DBConf,
|
|
|
+ app.RedisConf,
|
|
|
+ app.ServerConf.ProvisionerImageTag,
|
|
|
+ )
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ infra.Status = models.StatusError
|
|
|
+ infra, _ = app.Repo.Infra.UpdateInfra(infra)
|
|
|
+
|
|
|
+ app.handleErrorInternal(err, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ app.Logger.Info().Msgf("New gcp gke infra created: %d", infra.ID)
|
|
|
+
|
|
|
+ w.WriteHeader(http.StatusCreated)
|
|
|
+
|
|
|
+ infraExt := infra.Externalize()
|
|
|
+
|
|
|
+ if err := json.NewEncoder(w).Encode(infraExt); err != nil {
|
|
|
+ app.handleErrorFormDecoding(err, ErrProjectDecode, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// HandleDestroyGCPGKEInfra destroys gke infra
|
|
|
+func (app *App) HandleDestroyGCPGKEInfra(w http.ResponseWriter, r *http.Request) {
|
|
|
+ // get path parameters
|
|
|
+ infraID, err := strconv.ParseUint(chi.URLParam(r, "infra_id"), 10, 64)
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ app.handleErrorFormDecoding(err, ErrProjectDecode, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // read infra to get id
|
|
|
+ infra, err := app.Repo.Infra.ReadInfra(uint(infraID))
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ app.handleErrorDataRead(err, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ gcpInt, err := app.Repo.GCPIntegration.ReadGCPIntegration(infra.GCPIntegrationID)
|
|
|
+
|
|
|
+ form := &forms.DestroyGKEInfra{}
|
|
|
+
|
|
|
+ // decode from JSON to form value
|
|
|
+ if err := json.NewDecoder(r.Body).Decode(form); err != nil {
|
|
|
+ infra.Status = models.StatusError
|
|
|
+ infra, _ = app.Repo.Infra.UpdateInfra(infra)
|
|
|
+
|
|
|
+ app.handleErrorFormDecoding(err, ErrProjectDecode, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // validate the form
|
|
|
+ if err := app.validator.Struct(form); err != nil {
|
|
|
+ infra.Status = models.StatusError
|
|
|
+ infra, _ = app.Repo.Infra.UpdateInfra(infra)
|
|
|
+
|
|
|
+ app.handleErrorFormValidation(err, ErrProjectValidateFields, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // launch provisioning destruction pod
|
|
|
+ agent, err := kubernetes.GetAgentInClusterConfig()
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ infra.Status = models.StatusError
|
|
|
+ infra, _ = app.Repo.Infra.UpdateInfra(infra)
|
|
|
+
|
|
|
+ app.handleErrorDataRead(err, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // mark infra for deletion
|
|
|
+ infra.Status = models.StatusDestroying
|
|
|
+ infra, err = app.Repo.Infra.UpdateInfra(infra)
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ app.handleErrorDataWrite(err, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ _, err = agent.ProvisionGKE(
|
|
|
+ infra.ProjectID,
|
|
|
+ gcpInt,
|
|
|
+ form.GKEName,
|
|
|
+ infra,
|
|
|
+ provisioner.Destroy,
|
|
|
+ &app.DBConf,
|
|
|
+ app.RedisConf,
|
|
|
+ app.ServerConf.ProvisionerImageTag,
|
|
|
+ )
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ app.handleErrorInternal(err, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ app.Logger.Info().Msgf("GCP GKE infra marked for destruction: %d", infra.ID)
|
|
|
+
|
|
|
+ w.WriteHeader(http.StatusOK)
|
|
|
+}
|
|
|
+
|
|
|
// HandleGetProvisioningLogs returns real-time logs of the provisioning process via websockets
|
|
|
func (app *App) HandleGetProvisioningLogs(w http.ResponseWriter, r *http.Request) {
|
|
|
// get path parameters
|
|
|
@@ -403,7 +674,7 @@ func (app *App) HandleGetProvisioningLogs(w http.ResponseWriter, r *http.Request
|
|
|
}
|
|
|
|
|
|
// read infra to get id
|
|
|
- infra, err := app.Repo.AWSInfra.ReadAWSInfra(uint(infraID))
|
|
|
+ infra, err := app.Repo.Infra.ReadInfra(uint(infraID))
|
|
|
|
|
|
if err != nil {
|
|
|
app.handleErrorDataRead(err, w)
|
|
|
@@ -435,3 +706,359 @@ func (app *App) HandleGetProvisioningLogs(w http.ResponseWriter, r *http.Request
|
|
|
return
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+// HandleProvisionDODOCRInfra provisions a new digitalocean DOCR instance for a project
|
|
|
+func (app *App) HandleProvisionDODOCRInfra(w http.ResponseWriter, r *http.Request) {
|
|
|
+ projID, err := strconv.ParseUint(chi.URLParam(r, "project_id"), 0, 64)
|
|
|
+
|
|
|
+ if err != nil || projID == 0 {
|
|
|
+ app.handleErrorFormDecoding(err, ErrProjectDecode, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ form := &forms.CreateDOCRInfra{
|
|
|
+ ProjectID: uint(projID),
|
|
|
+ }
|
|
|
+
|
|
|
+ // decode from JSON to form value
|
|
|
+ if err := json.NewDecoder(r.Body).Decode(form); err != nil {
|
|
|
+ app.handleErrorFormDecoding(err, ErrProjectDecode, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // validate the form
|
|
|
+ if err := app.validator.Struct(form); err != nil {
|
|
|
+ app.handleErrorFormValidation(err, ErrProjectValidateFields, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // convert the form to an aws infra instance
|
|
|
+ infra, err := form.ToInfra()
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ app.handleErrorFormDecoding(err, ErrProjectDecode, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // handle write to the database
|
|
|
+ infra, err = app.Repo.Infra.CreateInfra(infra)
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ app.handleErrorDataWrite(err, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ oauthInt, err := app.Repo.OAuthIntegration.ReadOAuthIntegration(infra.DOIntegrationID)
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ infra.Status = models.StatusError
|
|
|
+ infra, _ = app.Repo.Infra.UpdateInfra(infra)
|
|
|
+
|
|
|
+ app.handleErrorDataRead(err, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // launch provisioning pod
|
|
|
+ agent, err := kubernetes.GetAgentInClusterConfig()
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ infra.Status = models.StatusError
|
|
|
+ infra, _ = app.Repo.Infra.UpdateInfra(infra)
|
|
|
+
|
|
|
+ app.handleErrorDataRead(err, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ _, err = agent.ProvisionDOCR(
|
|
|
+ uint(projID),
|
|
|
+ oauthInt,
|
|
|
+ app.DOConf,
|
|
|
+ *app.Repo,
|
|
|
+ form.DOCRName,
|
|
|
+ form.DOCRSubscriptionTier,
|
|
|
+ infra,
|
|
|
+ provisioner.Apply,
|
|
|
+ &app.DBConf,
|
|
|
+ app.RedisConf,
|
|
|
+ )
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ infra.Status = models.StatusError
|
|
|
+ infra, _ = app.Repo.Infra.UpdateInfra(infra)
|
|
|
+
|
|
|
+ app.handleErrorInternal(err, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ app.Logger.Info().Msgf("New do docr infra created: %d", infra.ID)
|
|
|
+
|
|
|
+ w.WriteHeader(http.StatusCreated)
|
|
|
+
|
|
|
+ infraExt := infra.Externalize()
|
|
|
+
|
|
|
+ if err := json.NewEncoder(w).Encode(infraExt); err != nil {
|
|
|
+ app.handleErrorFormDecoding(err, ErrProjectDecode, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// HandleDestroyAWSDOCRInfra destroys docr infra
|
|
|
+func (app *App) HandleDestroyDODOCRInfra(w http.ResponseWriter, r *http.Request) {
|
|
|
+ // get path parameters
|
|
|
+ infraID, err := strconv.ParseUint(chi.URLParam(r, "infra_id"), 10, 64)
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ app.handleErrorFormDecoding(err, ErrProjectDecode, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // read infra to get id
|
|
|
+ infra, err := app.Repo.Infra.ReadInfra(uint(infraID))
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ app.handleErrorDataRead(err, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ oauthInt, err := app.Repo.OAuthIntegration.ReadOAuthIntegration(infra.DOIntegrationID)
|
|
|
+
|
|
|
+ form := &forms.DestroyDOCRInfra{}
|
|
|
+
|
|
|
+ // decode from JSON to form value
|
|
|
+ if err := json.NewDecoder(r.Body).Decode(form); err != nil {
|
|
|
+ infra.Status = models.StatusError
|
|
|
+ infra, _ = app.Repo.Infra.UpdateInfra(infra)
|
|
|
+
|
|
|
+ app.handleErrorFormDecoding(err, ErrProjectDecode, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // validate the form
|
|
|
+ if err := app.validator.Struct(form); err != nil {
|
|
|
+ infra.Status = models.StatusError
|
|
|
+ infra, _ = app.Repo.Infra.UpdateInfra(infra)
|
|
|
+
|
|
|
+ app.handleErrorFormValidation(err, ErrProjectValidateFields, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // launch provisioning destruction pod
|
|
|
+ agent, err := kubernetes.GetAgentInClusterConfig()
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ infra.Status = models.StatusError
|
|
|
+ infra, _ = app.Repo.Infra.UpdateInfra(infra)
|
|
|
+
|
|
|
+ app.handleErrorDataRead(err, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // mark infra for deletion
|
|
|
+ infra.Status = models.StatusDestroying
|
|
|
+ infra, err = app.Repo.Infra.UpdateInfra(infra)
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ app.handleErrorDataWrite(err, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ _, err = agent.ProvisionDOCR(
|
|
|
+ infra.ProjectID,
|
|
|
+ oauthInt,
|
|
|
+ app.DOConf,
|
|
|
+ *app.Repo,
|
|
|
+ form.DOCRName,
|
|
|
+ "basic", // this doesn't matter for destroy
|
|
|
+ infra,
|
|
|
+ provisioner.Destroy,
|
|
|
+ &app.DBConf,
|
|
|
+ app.RedisConf,
|
|
|
+ )
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ app.handleErrorInternal(err, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ app.Logger.Info().Msgf("DO DOCR infra marked for destruction: %d", infra.ID)
|
|
|
+
|
|
|
+ w.WriteHeader(http.StatusOK)
|
|
|
+}
|
|
|
+
|
|
|
+// HandleProvisionDODOKSInfra provisions a new DO DOKS instance for a project
|
|
|
+func (app *App) HandleProvisionDODOKSInfra(w http.ResponseWriter, r *http.Request) {
|
|
|
+ projID, err := strconv.ParseUint(chi.URLParam(r, "project_id"), 0, 64)
|
|
|
+
|
|
|
+ if err != nil || projID == 0 {
|
|
|
+ app.handleErrorFormDecoding(err, ErrProjectDecode, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ form := &forms.CreateDOKSInfra{
|
|
|
+ ProjectID: uint(projID),
|
|
|
+ }
|
|
|
+
|
|
|
+ // decode from JSON to form value
|
|
|
+ if err := json.NewDecoder(r.Body).Decode(form); err != nil {
|
|
|
+ app.handleErrorFormDecoding(err, ErrProjectDecode, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // validate the form
|
|
|
+ if err := app.validator.Struct(form); err != nil {
|
|
|
+ app.handleErrorFormValidation(err, ErrProjectValidateFields, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // convert the form to an aws infra instance
|
|
|
+ infra, err := form.ToInfra()
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ app.handleErrorFormDecoding(err, ErrProjectDecode, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // handle write to the database
|
|
|
+ infra, err = app.Repo.Infra.CreateInfra(infra)
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ app.handleErrorDataWrite(err, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ oauthInt, err := app.Repo.OAuthIntegration.ReadOAuthIntegration(infra.DOIntegrationID)
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ infra.Status = models.StatusError
|
|
|
+ infra, _ = app.Repo.Infra.UpdateInfra(infra)
|
|
|
+
|
|
|
+ app.handleErrorDataRead(err, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // launch provisioning pod
|
|
|
+ agent, err := kubernetes.GetAgentInClusterConfig()
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ infra.Status = models.StatusError
|
|
|
+ infra, _ = app.Repo.Infra.UpdateInfra(infra)
|
|
|
+
|
|
|
+ app.handleErrorDataRead(err, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ _, err = agent.ProvisionDOKS(
|
|
|
+ uint(projID),
|
|
|
+ oauthInt,
|
|
|
+ app.DOConf,
|
|
|
+ *app.Repo,
|
|
|
+ form.DORegion,
|
|
|
+ form.DOKSName,
|
|
|
+ infra,
|
|
|
+ provisioner.Apply,
|
|
|
+ &app.DBConf,
|
|
|
+ app.RedisConf,
|
|
|
+ )
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ infra.Status = models.StatusError
|
|
|
+ infra, _ = app.Repo.Infra.UpdateInfra(infra)
|
|
|
+
|
|
|
+ app.handleErrorInternal(err, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ app.Logger.Info().Msgf("New do doks infra created: %d", infra.ID)
|
|
|
+
|
|
|
+ w.WriteHeader(http.StatusCreated)
|
|
|
+
|
|
|
+ infraExt := infra.Externalize()
|
|
|
+
|
|
|
+ if err := json.NewEncoder(w).Encode(infraExt); err != nil {
|
|
|
+ app.handleErrorFormDecoding(err, ErrProjectDecode, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// HandleDestroyDODOKSInfra destroys DOKS infra
|
|
|
+func (app *App) HandleDestroyDODOKSInfra(w http.ResponseWriter, r *http.Request) {
|
|
|
+ // get path parameters
|
|
|
+ infraID, err := strconv.ParseUint(chi.URLParam(r, "infra_id"), 10, 64)
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ app.handleErrorFormDecoding(err, ErrProjectDecode, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // read infra to get id
|
|
|
+ infra, err := app.Repo.Infra.ReadInfra(uint(infraID))
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ app.handleErrorDataRead(err, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ oauthInt, err := app.Repo.OAuthIntegration.ReadOAuthIntegration(infra.DOIntegrationID)
|
|
|
+
|
|
|
+ form := &forms.DestroyDOKSInfra{}
|
|
|
+
|
|
|
+ // decode from JSON to form value
|
|
|
+ if err := json.NewDecoder(r.Body).Decode(form); err != nil {
|
|
|
+ infra.Status = models.StatusError
|
|
|
+ infra, _ = app.Repo.Infra.UpdateInfra(infra)
|
|
|
+
|
|
|
+ app.handleErrorFormDecoding(err, ErrProjectDecode, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // validate the form
|
|
|
+ if err := app.validator.Struct(form); err != nil {
|
|
|
+ infra.Status = models.StatusError
|
|
|
+ infra, _ = app.Repo.Infra.UpdateInfra(infra)
|
|
|
+
|
|
|
+ app.handleErrorFormValidation(err, ErrProjectValidateFields, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // launch provisioning destruction pod
|
|
|
+ agent, err := kubernetes.GetAgentInClusterConfig()
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ infra.Status = models.StatusError
|
|
|
+ infra, _ = app.Repo.Infra.UpdateInfra(infra)
|
|
|
+
|
|
|
+ app.handleErrorDataRead(err, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // mark infra for deletion
|
|
|
+ infra.Status = models.StatusDestroying
|
|
|
+ infra, err = app.Repo.Infra.UpdateInfra(infra)
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ app.handleErrorDataWrite(err, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ _, err = agent.ProvisionDOKS(
|
|
|
+ infra.ProjectID,
|
|
|
+ oauthInt,
|
|
|
+ app.DOConf,
|
|
|
+ *app.Repo,
|
|
|
+ "nyc1",
|
|
|
+ form.DOKSName,
|
|
|
+ infra,
|
|
|
+ provisioner.Destroy,
|
|
|
+ &app.DBConf,
|
|
|
+ app.RedisConf,
|
|
|
+ )
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ app.handleErrorInternal(err, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ app.Logger.Info().Msgf("DO DOKS infra marked for destruction: %d", infra.ID)
|
|
|
+
|
|
|
+ w.WriteHeader(http.StatusOK)
|
|
|
+}
|