diff --git a/charts/fission-all/templates/deployment.yaml b/charts/fission-all/templates/deployment.yaml index bcc9e077..a9c7260a 100644 --- a/charts/fission-all/templates/deployment.yaml +++ b/charts/fission-all/templates/deployment.yaml @@ -126,6 +126,10 @@ spec: env: - name: FISSION_FUNCTION_NAMESPACE value: "{{ .Values.functionNamespace }}" + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace readinessProbe: httpGet: path: "/healthz" @@ -595,6 +599,7 @@ spec: metadata: labels: svc: storagesvc + application: fission-storage spec: containers: - name: storagesvc diff --git a/charts/fission-all/templates/svc.yaml b/charts/fission-all/templates/svc.yaml index 114bdccc..0dbfbbce 100644 --- a/charts/fission-all/templates/svc.yaml +++ b/charts/fission-all/templates/svc.yaml @@ -65,6 +65,7 @@ metadata: name: storagesvc labels: svc: storagesvc + application: fission-storage chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" spec: type: ClusterIP diff --git a/charts/fission-core/templates/deployment.yaml b/charts/fission-core/templates/deployment.yaml index 388b31ce..f9a2c60c 100644 --- a/charts/fission-core/templates/deployment.yaml +++ b/charts/fission-core/templates/deployment.yaml @@ -127,6 +127,10 @@ spec: env: - name: FISSION_FUNCTION_NAMESPACE value: "{{ .Values.functionNamespace }}" + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace readinessProbe: httpGet: path: "/healthz" @@ -335,6 +339,7 @@ spec: metadata: labels: svc: storagesvc + application: fission-storage spec: containers: - name: storagesvc diff --git a/charts/fission-core/templates/svc.yaml b/charts/fission-core/templates/svc.yaml index 1283bb29..d5ce78c5 100644 --- a/charts/fission-core/templates/svc.yaml +++ b/charts/fission-core/templates/svc.yaml @@ -44,6 +44,7 @@ metadata: name: storagesvc labels: svc: storagesvc + application: fission-storage chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" spec: type: ClusterIP diff --git a/controller/api.go b/controller/api.go index 75dd2449..22328e9a 100644 --- a/controller/api.go +++ b/controller/api.go @@ -35,6 +35,15 @@ import ( "github.com/fission/fission/fission/logdb" ) +var podNamespace string + +func init() { + podNamespace = os.Getenv("POD_NAMESPACE") + if podNamespace == "" { + podNamespace = "fission" + } +} + type ( API struct { fissionClient *crd.FissionClient @@ -167,6 +176,18 @@ func (api *API) HealthHandler(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) } +func (api *API) GetSvcName(w http.ResponseWriter, r *http.Request) { + appLabelSelector := "application=" + r.URL.Query().Get("application") + services, err := api.kubernetesClient.CoreV1().Services(podNamespace).List(metav1.ListOptions{ + LabelSelector: appLabelSelector, + }) + if err != nil || len(services.Items) > 1 || len(services.Items) == 0 { + api.respondWithError(w, err) + } + service := services.Items[0] + fmt.Fprintf(w, service.Name+"."+podNamespace) +} + func (api *API) Serve(port int) { r := mux.NewRouter() r.HandleFunc("/healthz", api.HealthHandler).Methods("GET") @@ -223,6 +244,7 @@ func (api *API) Serve(port int) { r.HandleFunc("/proxy/storage/v1/archive", api.StorageServiceProxy) r.HandleFunc("/proxy/logs/{function}", api.FunctionPodLogs).Methods("POST") r.HandleFunc("/proxy/workflows-apiserver/{path:.*}", api.WorkflowApiserverProxy) + r.HandleFunc("/proxy/svcname", api.GetSvcName).Queries("application", "").Methods("GET") address := fmt.Sprintf(":%v", port) diff --git a/controller/client/core.go b/controller/client/core.go index 3221eeb5..585d2dc7 100644 --- a/controller/client/core.go +++ b/controller/client/core.go @@ -19,6 +19,7 @@ package client import ( "encoding/json" "fmt" + "io/ioutil" "net/http" apiv1 "k8s.io/api/core/v1" @@ -72,3 +73,27 @@ func (c *Client) ConfigMapGet(m *metav1.ObjectMeta) (*apiv1.ConfigMap, error) { return &configMap, nil } + +func (c *Client) GetSvcURL(label string) (string, error) { + url := fmt.Sprintf("%s/proxy/svcname?"+label, c.Url) + + resp, err := http.Get(url) + + if err != nil { + return "", err + } + + if resp == nil { + return "", fmt.Errorf("Failed to find service for given label: %v", label) + } + + defer resp.Body.Close() + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return "", err + } + + storageSvc := string(body) + + return storageSvc, err +} diff --git a/fission/common.go b/fission/common.go index 167d1c06..925456cf 100644 --- a/fission/common.go +++ b/fission/common.go @@ -149,20 +149,6 @@ func createArchive(client *client.Client, fileName string, specFile string) *fis archive.Type = fission.ArchiveTypeLiteral archive.Literal = contents } else { - // make a kubernetes client - _, kubeClient, _, err := crd.GetKubernetesClient() - if err != nil { - log.Fatal(err.Error()) - } - - fissionNamespace := os.Getenv("FISSION_NAMESPACE") - - // get svc end point for storagesvc - service, err := kubeClient.CoreV1().Services(fissionNamespace).Get("storagesvc", metav1.GetOptions{}) - if err != nil { - log.Fatal(fmt.Sprintf("Error getting storage service object from kubernetes :%v", err.Error())) - } - u := strings.TrimSuffix(client.Url, "/") + "/proxy/storage" ssClient := storageSvcClient.MakeClient(u) @@ -170,13 +156,17 @@ func createArchive(client *client.Client, fileName string, specFile string) *fis id, err := ssClient.Upload(fileName, nil) checkErr(err, fmt.Sprintf("upload file %v", fileName)) - // this needs to be storagesvc.fission - storageSvcEndpoint := fmt.Sprintf("http://%s.%s/", service.Name, service.Namespace) - storageServiceClient := storageSvcClient.MakeClient(storageSvcEndpoint) - archiveUrl := storageServiceClient.GetUrl(id) + storageSvc, err := client.GetSvcURL("application=fission-storage") + storageSvcURL := "http://" + storageSvc + checkErr(err, "get fission storage service name") + + // We make a new client with actual URL of Storage service so that the URL is not + // pointing to 127.0.0.1 i.e. proxy. DON'T reuse previous ssClient + pkgClient := storageSvcClient.MakeClient(storageSvcURL) + archiveURL := pkgClient.GetUrl(id) archive.Type = fission.ArchiveTypeUrl - archive.URL = archiveUrl + archive.URL = archiveURL csum, err := fileChecksum(fileName) checkErr(err, fmt.Sprintf("calculate checksum for file %v", fileName)) diff --git a/fission/main.go b/fission/main.go index 4b22105c..e83e5f8e 100644 --- a/fission/main.go +++ b/fission/main.go @@ -48,6 +48,10 @@ func getKubeConfigPath() string { } func getServerUrl() string { + return getApplicationUrl("application=fission-api") +} + +func getApplicationUrl(selector string) string { var serverUrl string // Use FISSION_URL env variable if set; otherwise, port-forward to controller. fissionUrl := os.Getenv("FISSION_URL")