summaryrefslogtreecommitdiffstats
path: root/src/k8splugin/api/brokerhandler.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/k8splugin/api/brokerhandler.go')
-rw-r--r--src/k8splugin/api/brokerhandler.go164
1 files changed, 164 insertions, 0 deletions
diff --git a/src/k8splugin/api/brokerhandler.go b/src/k8splugin/api/brokerhandler.go
new file mode 100644
index 00000000..28e44231
--- /dev/null
+++ b/src/k8splugin/api/brokerhandler.go
@@ -0,0 +1,164 @@
+/*
+Copyright 2018 Intel Corporation.
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package api
+
+import (
+ "encoding/json"
+ "io"
+ "net/http"
+
+ "k8splugin/internal/app"
+
+ "github.com/gorilla/mux"
+)
+
+// Used to store the backend implementation objects
+// Also simplifies the mocking needed for unit testing
+type brokerInstanceHandler struct {
+ // Interface that implements the Instance operations
+ client app.InstanceManager
+}
+
+type brokerRequest struct {
+ GenericVnfID string `json:"generic-vnf-id"`
+ VFModuleID string `json:"vf-module-id"`
+ VFModuleModelInvariantID string `json:"vf-module-model-invariant-id"`
+ VFModuleModelVersionID string `json:"vf-module-model-version-id"`
+ VFModuleModelCustomizationID string `json:"vf-module-model-customization-id"`
+ OOFDirectives map[string]interface{} `json:"oof_directives"`
+ SDNCDirections map[string]interface{} `json:"sdnc_directives"`
+ UserDirectives map[string]interface{} `json:"user_directives"`
+ TemplateType string `json:"template_type"`
+ TemplateData map[string]interface{} `json:"template_data"`
+}
+
+type brokerPOSTResponse struct {
+ TemplateType string `json:"template_type"`
+ WorkloadID string `json:"workload_id"`
+ TemplateResponse map[string][]string `json:"template_response"`
+}
+
+type brokerGETResponse struct {
+ TemplateType string `json:"template_type"`
+ WorkloadID string `json:"workload_id"`
+ WorkloadStatus string `json:"workload_status"`
+}
+
+func (b brokerInstanceHandler) createHandler(w http.ResponseWriter, r *http.Request) {
+ vars := mux.Vars(r)
+ cloudRegion := vars["cloud-region"]
+
+ var req brokerRequest
+ err := json.NewDecoder(r.Body).Decode(&req)
+ switch {
+ case err == io.EOF:
+ http.Error(w, "Body empty", http.StatusBadRequest)
+ return
+ case err != nil:
+ http.Error(w, err.Error(), http.StatusUnprocessableEntity)
+ return
+ }
+
+ // Check body for expected parameters
+ if req.VFModuleModelCustomizationID == "" {
+ http.Error(w, "vf-module-model-customization-id is empty", http.StatusBadRequest)
+ return
+ }
+
+ rbName, ok := req.UserDirectives["definition-name"]
+ if !ok {
+ http.Error(w, "definition-name is missing from user-directives", http.StatusBadRequest)
+ return
+ }
+
+ rbVersion, ok := req.UserDirectives["definition-version"]
+ if !ok {
+ http.Error(w, "definition-version is missing from user-directives", http.StatusBadRequest)
+ return
+ }
+
+ profileName, ok := req.UserDirectives["profile-name"]
+ if !ok {
+ http.Error(w, "profile-name is missing from user-directives", http.StatusBadRequest)
+ return
+ }
+
+ // Setup the resource parameters for making the request
+ var instReq app.InstanceRequest
+ instReq.RBName = rbName.(string)
+ instReq.RBVersion = rbVersion.(string)
+ instReq.ProfileName = profileName.(string)
+ instReq.CloudRegion = cloudRegion
+
+ resp, err := b.client.Create(instReq)
+ if err != nil {
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
+ }
+
+ brokerResp := brokerPOSTResponse{
+ TemplateType: "heat",
+ WorkloadID: resp.ID,
+ TemplateResponse: resp.Resources,
+ }
+
+ w.Header().Set("Content-Type", "application/json")
+ w.WriteHeader(http.StatusCreated)
+ err = json.NewEncoder(w).Encode(brokerResp)
+ if err != nil {
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
+ }
+}
+
+// getHandler retrieves information about an instance via the ID
+func (b brokerInstanceHandler) getHandler(w http.ResponseWriter, r *http.Request) {
+ vars := mux.Vars(r)
+ instanceID := vars["instID"]
+
+ resp, err := b.client.Get(instanceID)
+ if err != nil {
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
+ }
+
+ brokerResp := brokerGETResponse{
+ TemplateType: "heat",
+ WorkloadID: resp.ID,
+ WorkloadStatus: "CREATED",
+ }
+
+ w.Header().Set("Content-Type", "application/json")
+ w.WriteHeader(http.StatusOK)
+ err = json.NewEncoder(w).Encode(brokerResp)
+ if err != nil {
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
+ }
+}
+
+// deleteHandler method terminates an instance via the ID
+func (b brokerInstanceHandler) deleteHandler(w http.ResponseWriter, r *http.Request) {
+ vars := mux.Vars(r)
+ instanceID := vars["instID"]
+
+ err := b.client.Delete(instanceID)
+ if err != nil {
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
+ }
+
+ w.Header().Set("Content-Type", "application/json")
+ w.WriteHeader(http.StatusAccepted)
+}