Add vnf definition APIs
[multicloud/k8s.git] / src / k8splugin / api / api.go
1 /*
2 Copyright 2018 Intel Corporation.
3 Licensed under the Apache License, Version 2.0 (the "License");
4 you may not use this file except in compliance with the License.
5 You may obtain a copy of the License at
6     http://www.apache.org/licenses/LICENSE-2.0
7 Unless required by applicable law or agreed to in writing, software
8 distributed under the License is distributed on an "AS IS" BASIS,
9 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10 See the License for the specific language governing permissions and
11 limitations under the License.
12 */
13
14 package api
15
16 import (
17         "k8splugin/vnfd"
18         "os"
19         "path/filepath"
20         "plugin"
21         "strings"
22
23         "github.com/gorilla/mux"
24         pkgerrors "github.com/pkg/errors"
25
26         "k8splugin/db"
27         "k8splugin/krd"
28 )
29
30 // CheckEnvVariables checks for required Environment variables
31 func CheckEnvVariables() error {
32         envList := []string{"CSAR_DIR", "KUBE_CONFIG_DIR", "PLUGINS_DIR", "DATABASE_TYPE", "DATABASE_IP"}
33         for _, env := range envList {
34                 if _, ok := os.LookupEnv(env); !ok {
35                         return pkgerrors.New("environment variable " + env + " not set")
36                 }
37         }
38
39         return nil
40 }
41
42 // CheckDatabaseConnection checks if the database is up and running and
43 // plugin can talk to it
44 func CheckDatabaseConnection() error {
45         err := db.CreateDBClient(os.Getenv("DATABASE_TYPE"))
46         if err != nil {
47                 return pkgerrors.Cause(err)
48         }
49
50         err = db.DBconn.InitializeDatabase()
51         if err != nil {
52                 return pkgerrors.Cause(err)
53         }
54
55         err = db.DBconn.CheckDatabase()
56         if err != nil {
57                 return pkgerrors.Cause(err)
58         }
59         return nil
60 }
61
62 // LoadPlugins loads all the compiled .so plugins
63 func LoadPlugins() error {
64         pluginsDir := os.Getenv("PLUGINS_DIR")
65         err := filepath.Walk(pluginsDir,
66                 func(path string, info os.FileInfo, err error) error {
67                         if strings.Contains(path, ".so") {
68                                 p, err := plugin.Open(path)
69                                 if err != nil {
70                                         return pkgerrors.Cause(err)
71                                 }
72
73                                 krd.LoadedPlugins[info.Name()[:len(info.Name())-3]] = p
74                         }
75                         return err
76                 })
77         if err != nil {
78                 return err
79         }
80
81         return nil
82 }
83
84 // CheckInitialSettings is used to check initial settings required to start api
85 func CheckInitialSettings() error {
86         err := CheckEnvVariables()
87         if err != nil {
88                 return pkgerrors.Cause(err)
89         }
90
91         err = CheckDatabaseConnection()
92         if err != nil {
93                 return pkgerrors.Cause(err)
94         }
95
96         err = LoadPlugins()
97         if err != nil {
98                 return pkgerrors.Cause(err)
99         }
100
101         return nil
102 }
103
104 // NewRouter creates a router instance that serves the VNFInstance web methods
105 func NewRouter(kubeconfig string) *mux.Router {
106         router := mux.NewRouter()
107
108         vnfInstanceHandler := router.PathPrefix("/v1/vnf_instances").Subrouter()
109         vnfInstanceHandler.HandleFunc("/", CreateHandler).Methods("POST").Name("VNFCreation")
110         vnfInstanceHandler.HandleFunc("/{cloudRegionID}/{namespace}", ListHandler).Methods("GET")
111         vnfInstanceHandler.HandleFunc("/{cloudRegionID}/{namespace}/{externalVNFID}", DeleteHandler).Methods("DELETE")
112         vnfInstanceHandler.HandleFunc("/{cloudRegionID}/{namespace}/{externalVNFID}", GetHandler).Methods("GET")
113
114         vnfdRouter := router.PathPrefix("/v1/vnfd").Subrouter()
115         vh := vnfdHandler{vnfdClient: vnfd.GetVNFDClient()}
116         vnfdRouter.HandleFunc("", vh.vnfdCreateHandler).Methods("POST")
117         vnfdRouter.HandleFunc("/{vnfdID}/upload", vh.vnfdUploadHandler).Methods("POST")
118         vnfdRouter.HandleFunc("", vh.vnfdListHandler).Methods("GET")
119         vnfdRouter.HandleFunc("/{vnfdID}", vh.vnfdGetHandler).Methods("GET")
120         vnfdRouter.HandleFunc("/{vnfdID}", vh.vnfdDeleteHandler).Methods("DELETE")
121
122         // (TODO): Fix update method
123         // vnfInstanceHandler.HandleFunc("/{vnfInstanceId}", UpdateHandler).Methods("PUT")
124
125         return router
126 }