Allow empty namespace for fission function and builder (#2621)
Currently, we create Fission resources in the default namespace, function-related resources are created in the fission-function namespace, whereas builder resources are created in the fission-builder namespace. This causes confusion for a lot of users. In this fix, we allow the user to set the function and builder namespace empty so that function and builder resources are created in the same namespace as the function resource always. If the user desires older behaviour they can functionNamespace and builderNamespace the same previous before the upgrade. * use default namespace for fission function and builder * support for existing fission namespaces * Replace builder and function namespace with template * Fix namespace creation template Signed-off-by: Sanket Sudake <sanketsudake@gmail.com>
This commit is contained in:
@@ -61,7 +61,7 @@ roleRef:
|
|||||||
subjects:
|
subjects:
|
||||||
- kind: ServiceAccount
|
- kind: ServiceAccount
|
||||||
name: fission-fetcher
|
name: fission-fetcher
|
||||||
namespace: {{ .Values.functionNamespace }}
|
namespace: {{template "fission-function-ns" . }}
|
||||||
---
|
---
|
||||||
apiVersion: rbac.authorization.k8s.io/v1
|
apiVersion: rbac.authorization.k8s.io/v1
|
||||||
kind: RoleBinding
|
kind: RoleBinding
|
||||||
@@ -75,5 +75,5 @@ roleRef:
|
|||||||
subjects:
|
subjects:
|
||||||
- kind: ServiceAccount
|
- kind: ServiceAccount
|
||||||
name: fission-builder
|
name: fission-builder
|
||||||
namespace: {{ .Values.builderNamespace }}
|
namespace: {{ template "fission-builder-ns" . }}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|||||||
@@ -86,4 +86,20 @@ Define the svc's name
|
|||||||
*/}}
|
*/}}
|
||||||
{{- define "fission-webhook.svc" -}}
|
{{- define "fission-webhook.svc" -}}
|
||||||
{{- printf "webhook-service" -}}
|
{{- printf "webhook-service" -}}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- define "fission-function-ns" -}}
|
||||||
|
{{- if .Values.functionNamespace -}}
|
||||||
|
{{- printf "%s" .Values.functionNamespace -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%s" .Values.defaultNamespace -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- define "fission-builder-ns" -}}
|
||||||
|
{{- if .Values.builderNamespace -}}
|
||||||
|
{{- printf "%s" .Values.builderNamespace -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- printf "%s" .Values.builderNamespace -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ spec:
|
|||||||
image: {{ include "fission-bundleImage" . | quote }}
|
image: {{ include "fission-bundleImage" . | quote }}
|
||||||
imagePullPolicy: {{ .Values.pullPolicy }}
|
imagePullPolicy: {{ .Values.pullPolicy }}
|
||||||
command: ["/fission-bundle"]
|
command: ["/fission-bundle"]
|
||||||
args: ["--builderMgr", "--storageSvcUrl", "http://storagesvc.{{ .Release.Namespace }}", "--envbuilder-namespace", "{{ .Values.builderNamespace }}"]
|
args: ["--builderMgr", "--storageSvcUrl", "http://storagesvc.{{ .Release.Namespace }}"]
|
||||||
env:
|
env:
|
||||||
- name: FETCHER_IMAGE
|
- name: FETCHER_IMAGE
|
||||||
{{- if eq .Values.fetcher.imageTag "" }}
|
{{- if eq .Values.fetcher.imageTag "" }}
|
||||||
@@ -39,6 +39,12 @@ spec:
|
|||||||
value: "{{ .Values.pullPolicy }}"
|
value: "{{ .Values.pullPolicy }}"
|
||||||
- name: BUILDER_IMAGE_PULL_POLICY
|
- name: BUILDER_IMAGE_PULL_POLICY
|
||||||
value: "{{ .Values.pullPolicy }}"
|
value: "{{ .Values.pullPolicy }}"
|
||||||
|
- name: FISSION_BUILDER_NAMESPACE
|
||||||
|
value: "{{ .Values.builderNamespace }}"
|
||||||
|
- name: FISSION_FUNCTION_NAMESPACE
|
||||||
|
value: "{{ .Values.functionNamespace }}"
|
||||||
|
- name: FISSION_DEFAULT_NAMESPACE
|
||||||
|
value: "{{ .Values.defaultNamespace }}"
|
||||||
- name: ENABLE_ISTIO
|
- name: ENABLE_ISTIO
|
||||||
value: "{{ .Values.enableIstio }}"
|
value: "{{ .Values.enableIstio }}"
|
||||||
- name: FETCHER_MINCPU
|
- name: FETCHER_MINCPU
|
||||||
|
|||||||
@@ -33,8 +33,12 @@ spec:
|
|||||||
command: ["/fission-bundle"]
|
command: ["/fission-bundle"]
|
||||||
args: ["--controllerPort", "8888"]
|
args: ["--controllerPort", "8888"]
|
||||||
env:
|
env:
|
||||||
|
- name: FISSION_DEFAULT_NAMESPACE
|
||||||
|
value: "{{ .Values.defaultNamespace }}"
|
||||||
|
- name: FISSION_BUILDER_NAMESPACE
|
||||||
|
value: "{{ .Values.builderNamespace }}"
|
||||||
- name: FISSION_FUNCTION_NAMESPACE
|
- name: FISSION_FUNCTION_NAMESPACE
|
||||||
value: "{{ .Values.functionNamespace }}"
|
value: "{{ .Values.functionNamespace }}"
|
||||||
- name: DEBUG_ENV
|
- name: DEBUG_ENV
|
||||||
value: {{ .Values.debugEnv | quote }}
|
value: {{ .Values.debugEnv | quote }}
|
||||||
- name: PPROF_ENABLED
|
- name: PPROF_ENABLED
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ spec:
|
|||||||
image: {{ include "fission-bundleImage" . | quote }}
|
image: {{ include "fission-bundleImage" . | quote }}
|
||||||
imagePullPolicy: {{ .Values.pullPolicy }}
|
imagePullPolicy: {{ .Values.pullPolicy }}
|
||||||
command: ["/fission-bundle"]
|
command: ["/fission-bundle"]
|
||||||
args: ["--executorPort", "8888", "--namespace", "{{ .Values.functionNamespace }}"]
|
args: ["--executorPort", "8888"]
|
||||||
env:
|
env:
|
||||||
- name: FETCHER_IMAGE
|
- name: FETCHER_IMAGE
|
||||||
{{- if eq .Values.fetcher.imageTag "" }}
|
{{- if eq .Values.fetcher.imageTag "" }}
|
||||||
@@ -37,6 +37,12 @@ spec:
|
|||||||
{{- end }}
|
{{- end }}
|
||||||
- name: FETCHER_IMAGE_PULL_POLICY
|
- name: FETCHER_IMAGE_PULL_POLICY
|
||||||
value: "{{ .Values.pullPolicy }}"
|
value: "{{ .Values.pullPolicy }}"
|
||||||
|
- name: FISSION_BUILDER_NAMESPACE
|
||||||
|
value: "{{ .Values.builderNamespace }}"
|
||||||
|
- name: FISSION_FUNCTION_NAMESPACE
|
||||||
|
value: "{{ .Values.functionNamespace }}"
|
||||||
|
- name: FISSION_DEFAULT_NAMESPACE
|
||||||
|
value: "{{ .Values.defaultNamespace }}"
|
||||||
- name: RUNTIME_IMAGE_PULL_POLICY
|
- name: RUNTIME_IMAGE_PULL_POLICY
|
||||||
value: "{{ .Values.pullPolicy }}"
|
value: "{{ .Values.pullPolicy }}"
|
||||||
- name: ADOPT_EXISTING_RESOURCES
|
- name: ADOPT_EXISTING_RESOURCES
|
||||||
|
|||||||
@@ -1,24 +1,29 @@
|
|||||||
{{- if .Values.createNamespace }}
|
{{- if .Values.createNamespace }}
|
||||||
|
{{- if and (ne .Values.functionNamespace "default") (ne .Values.functionNamespace "") }}
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: Namespace
|
kind: Namespace
|
||||||
metadata:
|
metadata:
|
||||||
name: {{ .Values.functionNamespace }}
|
name: {{ template "fission-function-ns" . }}
|
||||||
labels:
|
labels:
|
||||||
name: fission-function
|
name: fission-function
|
||||||
chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
|
chart: {{ .Chart.Name }}-{{ .Chart.Version }}
|
||||||
{{- if .Values.enableIstio }}
|
{{- if .Values.enableIstio }}
|
||||||
istio-injection: enabled
|
istio-injection: enabled
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
{{- end}}
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
{{- if and (ne .Values.builderNamespace "default") (ne .Values.builderNamespace "") }}
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: Namespace
|
kind: Namespace
|
||||||
metadata:
|
metadata:
|
||||||
name: {{ .Values.builderNamespace }}
|
name: {{ template "fission-builder-ns" . }}
|
||||||
labels:
|
labels:
|
||||||
name: fission-builder
|
name: fission-builder
|
||||||
chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
|
chart: {{ .Chart.Name }}-{{ .Chart.Version }}
|
||||||
{{- if .Values.enableIstio }}
|
{{- if .Values.enableIstio }}
|
||||||
istio-injection: enabled
|
istio-injection: enabled
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
@@ -8,7 +8,7 @@ can be used
|
|||||||
apiVersion: rbac.authorization.k8s.io/v1
|
apiVersion: rbac.authorization.k8s.io/v1
|
||||||
kind: Role
|
kind: Role
|
||||||
metadata:
|
metadata:
|
||||||
namespace: {{ .Values.functionNamespace }}
|
namespace: {{ template "fission-function-ns" . }}
|
||||||
name: {{ .Release.Name }}-event-fetcher
|
name: {{ .Release.Name }}-event-fetcher
|
||||||
rules:
|
rules:
|
||||||
- apiGroups:
|
- apiGroups:
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ apiVersion: rbac.authorization.k8s.io/v1
|
|||||||
kind: RoleBinding
|
kind: RoleBinding
|
||||||
metadata:
|
metadata:
|
||||||
name: {{ .Release.Name }}-fission-fetcher-pod-reader
|
name: {{ .Release.Name }}-fission-fetcher-pod-reader
|
||||||
namespace: {{ .Values.functionNamespace }}
|
namespace: {{ template "fission-function-ns" . }}
|
||||||
roleRef:
|
roleRef:
|
||||||
apiGroup: rbac.authorization.k8s.io
|
apiGroup: rbac.authorization.k8s.io
|
||||||
kind: Role
|
kind: Role
|
||||||
@@ -17,7 +17,7 @@ roleRef:
|
|||||||
subjects:
|
subjects:
|
||||||
- kind: ServiceAccount
|
- kind: ServiceAccount
|
||||||
name: fission-fetcher
|
name: fission-fetcher
|
||||||
namespace: {{ .Values.functionNamespace }}
|
namespace: {{ template "fission-function-ns" . }}
|
||||||
|
|
||||||
{{- if not .Values.singleDefaultNamespace }}
|
{{- if not .Values.singleDefaultNamespace }}
|
||||||
{{- range $namespace := $.Values.additionalFissionNamespaces }}
|
{{- range $namespace := $.Values.additionalFissionNamespaces }}
|
||||||
|
|||||||
@@ -2,11 +2,11 @@ apiVersion: v1
|
|||||||
kind: ServiceAccount
|
kind: ServiceAccount
|
||||||
metadata:
|
metadata:
|
||||||
name: fission-fetcher
|
name: fission-fetcher
|
||||||
namespace: {{ .Values.functionNamespace }}
|
namespace: {{ template "fission-function-ns" . }}
|
||||||
|
|
||||||
---
|
---
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: ServiceAccount
|
kind: ServiceAccount
|
||||||
metadata:
|
metadata:
|
||||||
name: fission-builder
|
name: fission-builder
|
||||||
namespace: {{ .Values.builderNamespace }}
|
namespace: {{ template "fission-builder-ns" . }}
|
||||||
|
|||||||
@@ -35,7 +35,6 @@ spec:
|
|||||||
{{- end }}
|
{{- end }}
|
||||||
imagePullPolicy: {{ .Values.pullPolicy }}
|
imagePullPolicy: {{ .Values.pullPolicy }}
|
||||||
command: [ "/pre-upgrade-checks" ]
|
command: [ "/pre-upgrade-checks" ]
|
||||||
args: ["--fn-pod-namespace", "{{ .Values.functionNamespace }}", "--envbuilder-namespace", "{{ .Values.builderNamespace }}"]
|
|
||||||
env:
|
env:
|
||||||
{{- include "fission-resource-namespace.envs" . | indent 8 }}
|
{{- include "fission-resource-namespace.envs" . | indent 8 }}
|
||||||
{{- if .Values.terminationMessagePath }}
|
{{- if .Values.terminationMessagePath }}
|
||||||
|
|||||||
@@ -61,16 +61,6 @@ controllerPort: 31313
|
|||||||
##
|
##
|
||||||
routerPort: 31314
|
routerPort: 31314
|
||||||
|
|
||||||
## functionNamespace represents the namespace in which Fission Function resources will be created.
|
|
||||||
## This is different from the release namespace.
|
|
||||||
##
|
|
||||||
functionNamespace: fission-function
|
|
||||||
|
|
||||||
## builderNamespace represents the namespace in which Fission Builder resources will be created.
|
|
||||||
## This is different from the release namespace.
|
|
||||||
##
|
|
||||||
builderNamespace: fission-builder
|
|
||||||
|
|
||||||
## defaultNamespace represents the namespace in which Fission custom resources will be created by the Fission user.
|
## defaultNamespace represents the namespace in which Fission custom resources will be created by the Fission user.
|
||||||
## This is different from the release namespace.
|
## This is different from the release namespace.
|
||||||
## Please consider setting `singleDefaultNamespace` and `additionalFissionNamespaces` if you want
|
## Please consider setting `singleDefaultNamespace` and `additionalFissionNamespaces` if you want
|
||||||
@@ -79,6 +69,18 @@ builderNamespace: fission-builder
|
|||||||
##
|
##
|
||||||
defaultNamespace: default
|
defaultNamespace: default
|
||||||
|
|
||||||
|
## builderNamespace represents the namespace in which Fission Builder resources will be created.
|
||||||
|
## if builderNamespace is set to empty then builder resources will be created in the same namespace as the Fission resources.
|
||||||
|
## This is different from the release namespace.
|
||||||
|
##
|
||||||
|
builderNamespace: ""
|
||||||
|
|
||||||
|
## functionNamespace represents the namespace in which Fission Function resources will be created.
|
||||||
|
## if functionNamespace is set to empty then function resources will be created in the same namespace as the Fission resources.
|
||||||
|
## This is different from the release namespace.
|
||||||
|
##
|
||||||
|
functionNamespace: ""
|
||||||
|
|
||||||
## If true, fission will only watch for fission custom resources created in the `defaultNamespace` above.
|
## If true, fission will only watch for fission custom resources created in the `defaultNamespace` above.
|
||||||
##
|
##
|
||||||
singleDefaultNamespace: true
|
singleDefaultNamespace: true
|
||||||
|
|||||||
@@ -62,8 +62,8 @@ func runRouter(ctx context.Context, logger *zap.Logger, port int, executorUrl st
|
|||||||
router.Start(ctx, logger, port, executorUrl)
|
router.Start(ctx, logger, port, executorUrl)
|
||||||
}
|
}
|
||||||
|
|
||||||
func runExecutor(ctx context.Context, logger *zap.Logger, port int, functionNamespace, envBuilderNamespace string) error {
|
func runExecutor(ctx context.Context, logger *zap.Logger, port int) error {
|
||||||
return executor.StartExecutor(ctx, logger, functionNamespace, envBuilderNamespace, port)
|
return executor.StartExecutor(ctx, logger, port)
|
||||||
}
|
}
|
||||||
|
|
||||||
func runKubeWatcher(ctx context.Context, logger *zap.Logger, routerUrl string) error {
|
func runKubeWatcher(ctx context.Context, logger *zap.Logger, routerUrl string) error {
|
||||||
@@ -87,8 +87,8 @@ func runStorageSvc(ctx context.Context, logger *zap.Logger, port int, storage st
|
|||||||
return storagesvc.Start(ctx, logger, storage, port)
|
return storagesvc.Start(ctx, logger, storage, port)
|
||||||
}
|
}
|
||||||
|
|
||||||
func runBuilderMgr(ctx context.Context, logger *zap.Logger, storageSvcUrl string, envBuilderNamespace string) error {
|
func runBuilderMgr(ctx context.Context, logger *zap.Logger, storageSvcUrl string) error {
|
||||||
return buildermgr.Start(ctx, logger, storageSvcUrl, envBuilderNamespace)
|
return buildermgr.Start(ctx, logger, storageSvcUrl)
|
||||||
}
|
}
|
||||||
|
|
||||||
func runLogger(ctx context.Context, logger *zap.Logger) {
|
func runLogger(ctx context.Context, logger *zap.Logger) {
|
||||||
@@ -232,9 +232,6 @@ Options:
|
|||||||
defer shutdown(ctx)
|
defer shutdown(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
functionNs := getStringArgWithDefault(arguments["--namespace"], "fission-function")
|
|
||||||
envBuilderNs := getStringArgWithDefault(arguments["--envbuilder-namespace"], "fission-builder")
|
|
||||||
|
|
||||||
executorUrl := getStringArgWithDefault(arguments["--executorUrl"], "http://executor.fission")
|
executorUrl := getStringArgWithDefault(arguments["--executorUrl"], "http://executor.fission")
|
||||||
routerUrl := getStringArgWithDefault(arguments["--routerUrl"], "http://router.fission")
|
routerUrl := getStringArgWithDefault(arguments["--routerUrl"], "http://router.fission")
|
||||||
storageSvcUrl := getStringArgWithDefault(arguments["--storageSvcUrl"], "http://storagesvc.fission")
|
storageSvcUrl := getStringArgWithDefault(arguments["--storageSvcUrl"], "http://storagesvc.fission")
|
||||||
@@ -270,7 +267,7 @@ Options:
|
|||||||
|
|
||||||
if arguments["--executorPort"] != nil {
|
if arguments["--executorPort"] != nil {
|
||||||
port := getPort(logger, arguments["--executorPort"])
|
port := getPort(logger, arguments["--executorPort"])
|
||||||
err = runExecutor(ctx, logger, port, functionNs, envBuilderNs)
|
err = runExecutor(ctx, logger, port)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("executor exited", zap.Error(err))
|
logger.Error("executor exited", zap.Error(err))
|
||||||
return
|
return
|
||||||
@@ -310,7 +307,7 @@ Options:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if arguments["--builderMgr"] == true {
|
if arguments["--builderMgr"] == true {
|
||||||
err = runBuilderMgr(ctx, logger, storageSvcUrl, envBuilderNs)
|
err = runBuilderMgr(ctx, logger, storageSvcUrl)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("builder manager exited", zap.Error(err))
|
logger.Error("builder manager exited", zap.Error(err))
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -42,8 +42,6 @@ type (
|
|||||||
fissionClient versioned.Interface
|
fissionClient versioned.Interface
|
||||||
k8sClient kubernetes.Interface
|
k8sClient kubernetes.Interface
|
||||||
apiExtClient apiextensionsclient.Interface
|
apiExtClient apiextensionsclient.Interface
|
||||||
fnPodNs string
|
|
||||||
envBuilderNs string
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -53,7 +51,7 @@ const (
|
|||||||
MqtCRD = "messagequeuetriggers.fission.io"
|
MqtCRD = "messagequeuetriggers.fission.io"
|
||||||
)
|
)
|
||||||
|
|
||||||
func makePreUpgradeTaskClient(logger *zap.Logger, fnPodNs, envBuilderNs string) (*PreUpgradeTaskClient, error) {
|
func makePreUpgradeTaskClient(logger *zap.Logger) (*PreUpgradeTaskClient, error) {
|
||||||
fissionClient, k8sClient, apiExtClient, _, err := crd.MakeFissionClient()
|
fissionClient, k8sClient, apiExtClient, _, err := crd.MakeFissionClient()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "error making fission client")
|
return nil, errors.Wrap(err, "error making fission client")
|
||||||
@@ -63,8 +61,6 @@ func makePreUpgradeTaskClient(logger *zap.Logger, fnPodNs, envBuilderNs string)
|
|||||||
logger: logger.Named("pre_upgrade_task_client"),
|
logger: logger.Named("pre_upgrade_task_client"),
|
||||||
fissionClient: fissionClient,
|
fissionClient: fissionClient,
|
||||||
k8sClient: k8sClient,
|
k8sClient: k8sClient,
|
||||||
fnPodNs: fnPodNs,
|
|
||||||
envBuilderNs: envBuilderNs,
|
|
||||||
apiExtClient: apiExtClient,
|
apiExtClient: apiExtClient,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,42 +17,17 @@ limitations under the License.
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/docopt/docopt-go"
|
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
"sigs.k8s.io/controller-runtime/pkg/manager/signals"
|
"sigs.k8s.io/controller-runtime/pkg/manager/signals"
|
||||||
|
|
||||||
"github.com/fission/fission/pkg/info"
|
|
||||||
"github.com/fission/fission/pkg/utils/loggerfactory"
|
"github.com/fission/fission/pkg/utils/loggerfactory"
|
||||||
)
|
)
|
||||||
|
|
||||||
func getStringArgWithDefault(arg interface{}, defaultValue string) string {
|
|
||||||
if arg != nil {
|
|
||||||
return arg.(string)
|
|
||||||
} else {
|
|
||||||
return defaultValue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
logger := loggerfactory.GetLogger()
|
logger := loggerfactory.GetLogger()
|
||||||
defer logger.Sync()
|
defer logger.Sync()
|
||||||
|
|
||||||
usage := `Package to perform operations needed prior to fission installation
|
crdBackedClient, err := makePreUpgradeTaskClient(logger)
|
||||||
Usage:
|
|
||||||
pre-upgrade-checks --fn-pod-namespace=<podNamespace> --envbuilder-namespace=<envBuilderNamespace>
|
|
||||||
Options:
|
|
||||||
--fn-pod-namespace=<podNamespace> Namespace where function pods get deployed.
|
|
||||||
--envbuilder-namespace=<envBuilderNamespace> Namespace where builder env pods are deployed.`
|
|
||||||
|
|
||||||
arguments, err := docopt.ParseArgs(usage, nil, info.BuildInfo().String())
|
|
||||||
if err != nil {
|
|
||||||
logger.Fatal("Could not parse command line arguments", zap.Error(err))
|
|
||||||
}
|
|
||||||
|
|
||||||
functionPodNs := getStringArgWithDefault(arguments["--fn-pod-namespace"], "fission-function")
|
|
||||||
envBuilderNs := getStringArgWithDefault(arguments["--envbuilder-namespace"], "fission-builder")
|
|
||||||
|
|
||||||
crdBackedClient, err := makePreUpgradeTaskClient(logger, functionPodNs, envBuilderNs)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Fatal("error creating a crd client, please retry helm upgrade",
|
logger.Fatal("error creating a crd client, please retry helm upgrade",
|
||||||
zap.Error(err))
|
zap.Error(err))
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// Start the buildermgr service.
|
// Start the buildermgr service.
|
||||||
func Start(ctx context.Context, logger *zap.Logger, storageSvcUrl string, envBuilderNamespace string) error {
|
func Start(ctx context.Context, logger *zap.Logger, storageSvcUrl string) error {
|
||||||
bmLogger := logger.Named("builder_manager")
|
bmLogger := logger.Named("builder_manager")
|
||||||
|
|
||||||
fissionClient, kubernetesClient, _, _, err := crd.MakeFissionClient()
|
fissionClient, kubernetesClient, _, _, err := crd.MakeFissionClient()
|
||||||
@@ -62,13 +62,13 @@ func Start(ctx context.Context, logger *zap.Logger, storageSvcUrl string, envBui
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
envWatcher := makeEnvironmentWatcher(ctx, bmLogger, fissionClient, kubernetesClient, fetcherConfig, envBuilderNamespace, podSpecPatch)
|
envWatcher := makeEnvironmentWatcher(ctx, bmLogger, fissionClient, kubernetesClient, fetcherConfig, podSpecPatch)
|
||||||
envWatcher.Run(ctx)
|
envWatcher.Run(ctx)
|
||||||
|
|
||||||
k8sInformerFactory := k8sInformers.NewSharedInformerFactory(kubernetesClient, time.Minute*30)
|
k8sInformerFactory := k8sInformers.NewSharedInformerFactory(kubernetesClient, time.Minute*30)
|
||||||
podInformer := k8sInformerFactory.Core().V1().Pods().Informer()
|
podInformer := k8sInformerFactory.Core().V1().Pods().Informer()
|
||||||
pkgWatcher := makePackageWatcher(bmLogger, fissionClient,
|
pkgWatcher := makePackageWatcher(bmLogger, fissionClient,
|
||||||
kubernetesClient, envBuilderNamespace, storageSvcUrl, podInformer,
|
kubernetesClient, storageSvcUrl, podInformer,
|
||||||
utils.GetInformersForNamespaces(fissionClient, time.Minute*30, fv1.PackagesResource))
|
utils.GetInformersForNamespaces(fissionClient, time.Minute*30, fv1.PackagesResource))
|
||||||
pkgWatcher.Run(ctx)
|
pkgWatcher.Run(ctx)
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -64,9 +64,9 @@ type (
|
|||||||
environmentWatcher struct {
|
environmentWatcher struct {
|
||||||
logger *zap.Logger
|
logger *zap.Logger
|
||||||
cache map[string]*builderInfo
|
cache map[string]*builderInfo
|
||||||
builderNamespace string
|
|
||||||
fissionClient versioned.Interface
|
fissionClient versioned.Interface
|
||||||
kubernetesClient kubernetes.Interface
|
kubernetesClient kubernetes.Interface
|
||||||
|
nsResolver *utils.NamespaceResolver
|
||||||
fetcherConfig *fetcherConfig.Config
|
fetcherConfig *fetcherConfig.Config
|
||||||
builderImagePullPolicy apiv1.PullPolicy
|
builderImagePullPolicy apiv1.PullPolicy
|
||||||
useIstio bool
|
useIstio bool
|
||||||
@@ -81,7 +81,6 @@ func makeEnvironmentWatcher(
|
|||||||
fissionClient versioned.Interface,
|
fissionClient versioned.Interface,
|
||||||
kubernetesClient kubernetes.Interface,
|
kubernetesClient kubernetes.Interface,
|
||||||
fetcherConfig *fetcherConfig.Config,
|
fetcherConfig *fetcherConfig.Config,
|
||||||
builderNamespace string,
|
|
||||||
podSpecPatch *apiv1.PodSpec) *environmentWatcher {
|
podSpecPatch *apiv1.PodSpec) *environmentWatcher {
|
||||||
|
|
||||||
useIstio := false
|
useIstio := false
|
||||||
@@ -99,9 +98,9 @@ func makeEnvironmentWatcher(
|
|||||||
envWatcher := &environmentWatcher{
|
envWatcher := &environmentWatcher{
|
||||||
logger: logger.Named("environment_watcher"),
|
logger: logger.Named("environment_watcher"),
|
||||||
cache: make(map[string]*builderInfo),
|
cache: make(map[string]*builderInfo),
|
||||||
builderNamespace: builderNamespace,
|
|
||||||
fissionClient: fissionClient,
|
fissionClient: fissionClient,
|
||||||
kubernetesClient: kubernetesClient,
|
kubernetesClient: kubernetesClient,
|
||||||
|
nsResolver: utils.DefaultNSResolver(),
|
||||||
builderImagePullPolicy: builderImagePullPolicy,
|
builderImagePullPolicy: builderImagePullPolicy,
|
||||||
useIstio: useIstio,
|
useIstio: useIstio,
|
||||||
fetcherConfig: fetcherConfig,
|
fetcherConfig: fetcherConfig,
|
||||||
@@ -161,7 +160,7 @@ func (envw *environmentWatcher) AddUpdateBuilder(ctx context.Context, env *fv1.E
|
|||||||
//builder is not supported with v1 interface and ignore env without builder image
|
//builder is not supported with v1 interface and ignore env without builder image
|
||||||
if env.Spec.Version != 1 && len(env.Spec.Builder.Image) != 0 {
|
if env.Spec.Version != 1 && len(env.Spec.Builder.Image) != 0 {
|
||||||
if _, ok := envw.cache[crd.CacheKeyUID(&env.ObjectMeta)]; !ok {
|
if _, ok := envw.cache[crd.CacheKeyUID(&env.ObjectMeta)]; !ok {
|
||||||
builderInfo, err := envw.createBuilder(ctx, env, envw.getNamespace(env))
|
builderInfo, err := envw.createBuilder(ctx, env, envw.nsResolver.GetBuilderNS(env.ObjectMeta.Namespace))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
envw.logger.Error("error creating builder service", zap.Error(err))
|
envw.logger.Error("error creating builder service", zap.Error(err))
|
||||||
return
|
return
|
||||||
@@ -170,7 +169,7 @@ func (envw *environmentWatcher) AddUpdateBuilder(ctx context.Context, env *fv1.E
|
|||||||
} else {
|
} else {
|
||||||
envw.DeleteBuilder(ctx, env)
|
envw.DeleteBuilder(ctx, env)
|
||||||
// once older builder deleted then add new builder service
|
// once older builder deleted then add new builder service
|
||||||
builderInfo, err := envw.createBuilder(ctx, env, envw.getNamespace(env))
|
builderInfo, err := envw.createBuilder(ctx, env, envw.nsResolver.GetBuilderNS(env.ObjectMeta.Namespace))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
envw.logger.Error("error updating builder service", zap.Error(err))
|
envw.logger.Error("error updating builder service", zap.Error(err))
|
||||||
return
|
return
|
||||||
@@ -185,24 +184,14 @@ func (envw *environmentWatcher) DeleteBuilder(ctx context.Context, env *fv1.Envi
|
|||||||
envw.DeleteBuilderService(ctx, env)
|
envw.DeleteBuilderService(ctx, env)
|
||||||
envw.DeleteBuilderDeployment(ctx, env)
|
envw.DeleteBuilderDeployment(ctx, env)
|
||||||
delete(envw.cache, crd.CacheKeyUID(&env.ObjectMeta))
|
delete(envw.cache, crd.CacheKeyUID(&env.ObjectMeta))
|
||||||
envw.logger.Info("builder service deleted", zap.String("env_name", env.ObjectMeta.Name), zap.String("namespace", envw.getNamespace(env)))
|
envw.logger.Info("builder service deleted", zap.String("env_name", env.ObjectMeta.Name), zap.String("namespace", envw.nsResolver.GetBuilderNS(env.ObjectMeta.Namespace)))
|
||||||
} else {
|
} else {
|
||||||
envw.logger.Debug("builder service not found", zap.String("env_name", env.ObjectMeta.Name), zap.String("namespace", envw.getNamespace(env)))
|
envw.logger.Debug("builder service not found", zap.String("env_name", env.ObjectMeta.Name), zap.String("namespace", envw.nsResolver.GetBuilderNS(env.ObjectMeta.Namespace)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (envw *environmentWatcher) getNamespace(env *fv1.Environment) string {
|
|
||||||
// In order to support backward compatibility, for all environments with builder image created in default env,
|
|
||||||
// the pods will be created in fission-builder namespace
|
|
||||||
ns := envw.builderNamespace
|
|
||||||
if env.ObjectMeta.Namespace != metav1.NamespaceDefault {
|
|
||||||
ns = env.ObjectMeta.Namespace
|
|
||||||
}
|
|
||||||
return ns
|
|
||||||
}
|
|
||||||
|
|
||||||
func (envw *environmentWatcher) DeleteBuilderService(ctx context.Context, env *fv1.Environment) {
|
func (envw *environmentWatcher) DeleteBuilderService(ctx context.Context, env *fv1.Environment) {
|
||||||
ns := envw.getNamespace(env)
|
ns := envw.nsResolver.GetBuilderNS(env.ObjectMeta.Namespace)
|
||||||
svcList, err := envw.getBuilderServiceList(ctx, envw.getDeploymentLabels(env.ObjectMeta.Name), ns)
|
svcList, err := envw.getBuilderServiceList(ctx, envw.getDeploymentLabels(env.ObjectMeta.Name), ns)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
envw.logger.Error("error getting the builder service list", zap.Error(err))
|
envw.logger.Error("error getting the builder service list", zap.Error(err))
|
||||||
@@ -227,7 +216,7 @@ func (envw *environmentWatcher) DeleteBuilderService(ctx context.Context, env *f
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (envw *environmentWatcher) DeleteBuilderDeployment(ctx context.Context, env *fv1.Environment) {
|
func (envw *environmentWatcher) DeleteBuilderDeployment(ctx context.Context, env *fv1.Environment) {
|
||||||
ns := envw.getNamespace(env)
|
ns := envw.nsResolver.GetBuilderNS(env.ObjectMeta.Namespace)
|
||||||
deployList, err := envw.getBuilderDeploymentList(ctx, envw.getDeploymentLabels(env.ObjectMeta.Name), ns)
|
deployList, err := envw.getBuilderDeploymentList(ctx, envw.getDeploymentLabels(env.ObjectMeta.Name), ns)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
envw.logger.Error("error getting the builder deployment list", zap.Error(err))
|
envw.logger.Error("error getting the builder deployment list", zap.Error(err))
|
||||||
|
|||||||
@@ -37,29 +37,29 @@ import (
|
|||||||
|
|
||||||
type (
|
type (
|
||||||
packageWatcher struct {
|
packageWatcher struct {
|
||||||
logger *zap.Logger
|
logger *zap.Logger
|
||||||
fissionClient versioned.Interface
|
fissionClient versioned.Interface
|
||||||
k8sClient kubernetes.Interface
|
nsResolver *utils.NamespaceResolver
|
||||||
podInformer k8sCache.SharedIndexInformer
|
k8sClient kubernetes.Interface
|
||||||
pkgInformer map[string]k8sCache.SharedIndexInformer
|
podInformer k8sCache.SharedIndexInformer
|
||||||
builderNamespace string
|
pkgInformer map[string]k8sCache.SharedIndexInformer
|
||||||
storageSvcUrl string
|
storageSvcUrl string
|
||||||
buildCache *cache.Cache
|
buildCache *cache.Cache
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
func makePackageWatcher(logger *zap.Logger, fissionClient versioned.Interface, k8sClientSet kubernetes.Interface,
|
func makePackageWatcher(logger *zap.Logger, fissionClient versioned.Interface, k8sClientSet kubernetes.Interface,
|
||||||
builderNamespace string, storageSvcUrl string, podInformer k8sCache.SharedIndexInformer,
|
storageSvcUrl string, podInformer k8sCache.SharedIndexInformer,
|
||||||
pkgInformer map[string]k8sCache.SharedIndexInformer) *packageWatcher {
|
pkgInformer map[string]k8sCache.SharedIndexInformer) *packageWatcher {
|
||||||
pkgw := &packageWatcher{
|
pkgw := &packageWatcher{
|
||||||
logger: logger.Named("package_watcher"),
|
logger: logger.Named("package_watcher"),
|
||||||
fissionClient: fissionClient,
|
fissionClient: fissionClient,
|
||||||
k8sClient: k8sClientSet,
|
k8sClient: k8sClientSet,
|
||||||
podInformer: podInformer,
|
nsResolver: utils.DefaultNSResolver(),
|
||||||
pkgInformer: pkgInformer,
|
podInformer: podInformer,
|
||||||
builderNamespace: builderNamespace,
|
pkgInformer: pkgInformer,
|
||||||
storageSvcUrl: storageSvcUrl,
|
storageSvcUrl: storageSvcUrl,
|
||||||
buildCache: cache.MakeCache(0, 0),
|
buildCache: cache.MakeCache(0, 0),
|
||||||
}
|
}
|
||||||
return pkgw
|
return pkgw
|
||||||
}
|
}
|
||||||
@@ -137,12 +137,7 @@ func (pkgw *packageWatcher) build(ctx context.Context, srcpkg *fv1.Package) {
|
|||||||
for _, item := range items {
|
for _, item := range items {
|
||||||
pod := item.(*apiv1.Pod)
|
pod := item.(*apiv1.Pod)
|
||||||
|
|
||||||
// In order to support backward compatibility, for all builder images created in default env,
|
builderNs := pkgw.nsResolver.GetBuilderNS(env.ObjectMeta.Namespace)
|
||||||
// the pods will be created in fission-builder namespace
|
|
||||||
builderNs := pkgw.builderNamespace
|
|
||||||
if env.ObjectMeta.Namespace != metav1.NamespaceDefault {
|
|
||||||
builderNs = env.ObjectMeta.Namespace
|
|
||||||
}
|
|
||||||
|
|
||||||
// Filter non-matching pods
|
// Filter non-matching pods
|
||||||
if pod.ObjectMeta.Labels[LABEL_ENV_NAME] != env.ObjectMeta.Name ||
|
if pod.ObjectMeta.Labels[LABEL_ENV_NAME] != env.ObjectMeta.Name ||
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ import (
|
|||||||
"github.com/fission/fission/pkg/fission-cli/logdb"
|
"github.com/fission/fission/pkg/fission-cli/logdb"
|
||||||
"github.com/fission/fission/pkg/generated/clientset/versioned"
|
"github.com/fission/fission/pkg/generated/clientset/versioned"
|
||||||
"github.com/fission/fission/pkg/info"
|
"github.com/fission/fission/pkg/info"
|
||||||
|
"github.com/fission/fission/pkg/utils"
|
||||||
"github.com/fission/fission/pkg/utils/httpserver"
|
"github.com/fission/fission/pkg/utils/httpserver"
|
||||||
"github.com/fission/fission/pkg/utils/metrics"
|
"github.com/fission/fission/pkg/utils/metrics"
|
||||||
"github.com/fission/fission/pkg/utils/otel"
|
"github.com/fission/fission/pkg/utils/otel"
|
||||||
@@ -91,12 +92,8 @@ func MakeAPI(logger *zap.Logger) (*API, error) {
|
|||||||
api.workflowApiUrl = "http://workflows-apiserver"
|
api.workflowApiUrl = "http://workflows-apiserver"
|
||||||
}
|
}
|
||||||
|
|
||||||
fnNs := os.Getenv("FISSION_FUNCTION_NAMESPACE")
|
nsResolver := utils.DefaultNSResolver()
|
||||||
if len(fnNs) > 0 {
|
api.functionNamespace = nsResolver.ResolveNamespace(os.Getenv(utils.ENV_FUNCTION_NAMESPACE))
|
||||||
api.functionNamespace = fnNs
|
|
||||||
} else {
|
|
||||||
api.functionNamespace = "fission-function"
|
|
||||||
}
|
|
||||||
|
|
||||||
return api, err
|
return api, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -255,7 +255,7 @@ func (executor *Executor) getFunctionServiceFromCache(ctx context.Context, fn *f
|
|||||||
|
|
||||||
// StartExecutor Starts executor and the executor components such as Poolmgr,
|
// StartExecutor Starts executor and the executor components such as Poolmgr,
|
||||||
// deploymgr and potential future executor types
|
// deploymgr and potential future executor types
|
||||||
func StartExecutor(ctx context.Context, logger *zap.Logger, functionNamespace string, envBuilderNamespace string, port int) error {
|
func StartExecutor(ctx context.Context, logger *zap.Logger, port int) error {
|
||||||
fissionClient, kubernetesClient, _, metricsClient, err := crd.MakeFissionClient()
|
fissionClient, kubernetesClient, _, metricsClient, err := crd.MakeFissionClient()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "failed to get kubernetes client")
|
return errors.Wrap(err, "failed to get kubernetes client")
|
||||||
@@ -306,7 +306,7 @@ func StartExecutor(ctx context.Context, logger *zap.Logger, functionNamespace st
|
|||||||
gpm, err := poolmgr.MakeGenericPoolManager(ctx,
|
gpm, err := poolmgr.MakeGenericPoolManager(ctx,
|
||||||
logger,
|
logger,
|
||||||
fissionClient, kubernetesClient, metricsClient,
|
fissionClient, kubernetesClient, metricsClient,
|
||||||
functionNamespace, fetcherConfig, executorInstanceID,
|
fetcherConfig, executorInstanceID,
|
||||||
funcInformer, pkgInformer, envInformer,
|
funcInformer, pkgInformer, envInformer,
|
||||||
gpmPodInformer, gpmRsInformer, podSpecPatch)
|
gpmPodInformer, gpmRsInformer, podSpecPatch)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -322,7 +322,7 @@ func StartExecutor(ctx context.Context, logger *zap.Logger, functionNamespace st
|
|||||||
ndm, err := newdeploy.MakeNewDeploy(ctx,
|
ndm, err := newdeploy.MakeNewDeploy(ctx,
|
||||||
logger,
|
logger,
|
||||||
fissionClient, kubernetesClient,
|
fissionClient, kubernetesClient,
|
||||||
functionNamespace, fetcherConfig, executorInstanceID,
|
fetcherConfig, executorInstanceID,
|
||||||
funcInformer, envInformer,
|
funcInformer, envInformer,
|
||||||
ndmDeplInformer, ndmSvcInformer, podSpecPatch)
|
ndmDeplInformer, ndmSvcInformer, podSpecPatch)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -338,7 +338,7 @@ func StartExecutor(ctx context.Context, logger *zap.Logger, functionNamespace st
|
|||||||
cnm, err := container.MakeContainer(
|
cnm, err := container.MakeContainer(
|
||||||
ctx, logger,
|
ctx, logger,
|
||||||
fissionClient, kubernetesClient,
|
fissionClient, kubernetesClient,
|
||||||
functionNamespace, executorInstanceID, funcInformer,
|
executorInstanceID, funcInformer,
|
||||||
cnmDeplInformer, cnmSvcInformer)
|
cnmDeplInformer, cnmSvcInformer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "container manager creation failed")
|
return errors.Wrap(err, "container manager creation failed")
|
||||||
@@ -408,7 +408,8 @@ func StartExecutor(ctx context.Context, logger *zap.Logger, functionNamespace st
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
go reaper.CleanupRoleBindings(ctx, logger, kubernetesClient, fissionClient, functionNamespace, envBuilderNamespace, time.Minute*30)
|
|
||||||
|
go reaper.CleanupRoleBindings(ctx, logger, kubernetesClient, fissionClient, time.Minute*30)
|
||||||
go metrics.ServeMetrics(ctx, logger)
|
go metrics.ServeMetrics(ctx, logger)
|
||||||
go api.Serve(ctx, port)
|
go api.Serve(ctx, port)
|
||||||
|
|
||||||
|
|||||||
@@ -174,7 +174,7 @@ func TestExecutor(t *testing.T) {
|
|||||||
|
|
||||||
// create poolmgr
|
// create poolmgr
|
||||||
port := 9999
|
port := 9999
|
||||||
err = StartExecutor(ctx, logger, functionNs, "fission-builder", port)
|
err = StartExecutor(ctx, logger, port)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Panicf("failed to start poolmgr: %v", err)
|
log.Panicf("failed to start poolmgr: %v", err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,7 +57,9 @@ import (
|
|||||||
otelUtils "github.com/fission/fission/pkg/utils/otel"
|
otelUtils "github.com/fission/fission/pkg/utils/otel"
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ executortype.ExecutorType = &Container{}
|
var (
|
||||||
|
_ executortype.ExecutorType = &Container{}
|
||||||
|
)
|
||||||
|
|
||||||
type (
|
type (
|
||||||
// Container represents an executor type
|
// Container represents an executor type
|
||||||
@@ -67,10 +69,10 @@ type (
|
|||||||
kubernetesClient kubernetes.Interface
|
kubernetesClient kubernetes.Interface
|
||||||
fissionClient versioned.Interface
|
fissionClient versioned.Interface
|
||||||
instanceID string
|
instanceID string
|
||||||
|
nsResolver *utils.NamespaceResolver
|
||||||
// fetcherConfig *fetcherConfig.Config
|
// fetcherConfig *fetcherConfig.Config
|
||||||
|
|
||||||
runtimeImagePullPolicy apiv1.PullPolicy
|
runtimeImagePullPolicy apiv1.PullPolicy
|
||||||
namespace string
|
|
||||||
useIstio bool
|
useIstio bool
|
||||||
|
|
||||||
fsCache *fscache.FunctionServiceCache // cache funcSvc's by function, address and pod name
|
fsCache *fscache.FunctionServiceCache // cache funcSvc's by function, address and pod name
|
||||||
@@ -96,7 +98,6 @@ func MakeContainer(
|
|||||||
logger *zap.Logger,
|
logger *zap.Logger,
|
||||||
fissionClient versioned.Interface,
|
fissionClient versioned.Interface,
|
||||||
kubernetesClient kubernetes.Interface,
|
kubernetesClient kubernetes.Interface,
|
||||||
namespace string,
|
|
||||||
instanceID string,
|
instanceID string,
|
||||||
funcInformer map[string]finformerv1.FunctionInformer,
|
funcInformer map[string]finformerv1.FunctionInformer,
|
||||||
deplInformer appsinformers.DeploymentInformer,
|
deplInformer appsinformers.DeploymentInformer,
|
||||||
@@ -117,8 +118,8 @@ func MakeContainer(
|
|||||||
fissionClient: fissionClient,
|
fissionClient: fissionClient,
|
||||||
kubernetesClient: kubernetesClient,
|
kubernetesClient: kubernetesClient,
|
||||||
instanceID: instanceID,
|
instanceID: instanceID,
|
||||||
|
nsResolver: utils.DefaultNSResolver(),
|
||||||
|
|
||||||
namespace: namespace,
|
|
||||||
fsCache: fscache.MakeFunctionServiceCache(logger),
|
fsCache: fscache.MakeFunctionServiceCache(logger),
|
||||||
throttler: throttler.MakeThrottler(1 * time.Minute),
|
throttler: throttler.MakeThrottler(1 * time.Minute),
|
||||||
|
|
||||||
@@ -129,6 +130,7 @@ func MakeContainer(
|
|||||||
objectReaperIntervalSecond: time.Duration(executorUtils.GetObjectReaperInterval(logger, fv1.ExecutorTypeContainer, 5)) * time.Second,
|
objectReaperIntervalSecond: time.Duration(executorUtils.GetObjectReaperInterval(logger, fv1.ExecutorTypeContainer, 5)) * time.Second,
|
||||||
hpaops: hpautils.NewHpaOperations(logger, kubernetesClient, instanceID),
|
hpaops: hpautils.NewHpaOperations(logger, kubernetesClient, instanceID),
|
||||||
}
|
}
|
||||||
|
|
||||||
caaf.deplLister = deplInformer.Lister()
|
caaf.deplLister = deplInformer.Lister()
|
||||||
caaf.deplListerSynced = deplInformer.Informer().HasSynced
|
caaf.deplListerSynced = deplInformer.Informer().HasSynced
|
||||||
|
|
||||||
@@ -382,10 +384,7 @@ func (caaf *Container) fnCreate(ctx context.Context, fn *fv1.Function) (*fscache
|
|||||||
|
|
||||||
// to support backward compatibility, if the function was created in default ns, we fall back to creating the
|
// to support backward compatibility, if the function was created in default ns, we fall back to creating the
|
||||||
// deployment of the function in fission-function ns
|
// deployment of the function in fission-function ns
|
||||||
ns := caaf.namespace
|
ns := caaf.nsResolver.GetFunctionNS(fn.ObjectMeta.Namespace)
|
||||||
if fn.ObjectMeta.Namespace != metav1.NamespaceDefault {
|
|
||||||
ns = fn.ObjectMeta.Namespace
|
|
||||||
}
|
|
||||||
|
|
||||||
// Envoy(istio-proxy) returns 404 directly before istio pilot
|
// Envoy(istio-proxy) returns 404 directly before istio pilot
|
||||||
// propagates latest Envoy-specific configuration.
|
// propagates latest Envoy-specific configuration.
|
||||||
@@ -499,10 +498,7 @@ func (caaf *Container) updateFunction(ctx context.Context, oldFn *fv1.Function,
|
|||||||
if !reflect.DeepEqual(oldFn.Spec.InvokeStrategy, newFn.Spec.InvokeStrategy) {
|
if !reflect.DeepEqual(oldFn.Spec.InvokeStrategy, newFn.Spec.InvokeStrategy) {
|
||||||
// to support backward compatibility, if the function was created in default ns, we fall back to creating the
|
// to support backward compatibility, if the function was created in default ns, we fall back to creating the
|
||||||
// deployment of the function in fission-function ns, so cleaning up resources there
|
// deployment of the function in fission-function ns, so cleaning up resources there
|
||||||
ns := caaf.namespace
|
ns := caaf.nsResolver.GetFunctionNS(newFn.ObjectMeta.Namespace)
|
||||||
if newFn.ObjectMeta.Namespace != metav1.NamespaceDefault {
|
|
||||||
ns = newFn.ObjectMeta.Namespace
|
|
||||||
}
|
|
||||||
|
|
||||||
fsvc, err := caaf.fsCache.GetByFunctionUID(newFn.ObjectMeta.UID)
|
fsvc, err := caaf.fsCache.GetByFunctionUID(newFn.ObjectMeta.UID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -598,10 +594,7 @@ func (caaf *Container) updateFuncDeployment(ctx context.Context, fn *fv1.Functio
|
|||||||
|
|
||||||
// to support backward compatibility, if the function was created in default ns, we fall back to creating the
|
// to support backward compatibility, if the function was created in default ns, we fall back to creating the
|
||||||
// deployment of the function in fission-function ns
|
// deployment of the function in fission-function ns
|
||||||
ns := caaf.namespace
|
ns := caaf.nsResolver.GetFunctionNS(fn.ObjectMeta.Namespace)
|
||||||
if fn.ObjectMeta.Namespace != metav1.NamespaceDefault {
|
|
||||||
ns = fn.ObjectMeta.Namespace
|
|
||||||
}
|
|
||||||
|
|
||||||
existingDepl, err := caaf.kubernetesClient.AppsV1().Deployments(ns).Get(ctx, fnObjName, metav1.GetOptions{})
|
existingDepl, err := caaf.kubernetesClient.AppsV1().Deployments(ns).Get(ctx, fnObjName, metav1.GetOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -651,10 +644,7 @@ func (caaf *Container) fnDelete(ctx context.Context, fn *fv1.Function) error {
|
|||||||
|
|
||||||
// to support backward compatibility, if the function was created in default ns, we fall back to creating the
|
// to support backward compatibility, if the function was created in default ns, we fall back to creating the
|
||||||
// deployment of the function in fission-function ns, so cleaning up resources there
|
// deployment of the function in fission-function ns, so cleaning up resources there
|
||||||
ns := caaf.namespace
|
ns := caaf.nsResolver.GetFunctionNS(fn.ObjectMeta.Namespace)
|
||||||
if fn.ObjectMeta.Namespace != metav1.NamespaceDefault {
|
|
||||||
ns = fn.ObjectMeta.Namespace
|
|
||||||
}
|
|
||||||
|
|
||||||
err = caaf.cleanupContainer(ctx, ns, objName)
|
err = caaf.cleanupContainer(ctx, ns, objName)
|
||||||
multierr = multierror.Append(multierr, err)
|
multierr = multierror.Append(multierr, err)
|
||||||
|
|||||||
@@ -59,7 +59,9 @@ import (
|
|||||||
otelUtils "github.com/fission/fission/pkg/utils/otel"
|
otelUtils "github.com/fission/fission/pkg/utils/otel"
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ executortype.ExecutorType = &NewDeploy{}
|
var (
|
||||||
|
_ executortype.ExecutorType = &NewDeploy{}
|
||||||
|
)
|
||||||
|
|
||||||
type (
|
type (
|
||||||
// NewDeploy represents an ExecutorType
|
// NewDeploy represents an ExecutorType
|
||||||
@@ -70,9 +72,9 @@ type (
|
|||||||
fissionClient versioned.Interface
|
fissionClient versioned.Interface
|
||||||
instanceID string
|
instanceID string
|
||||||
fetcherConfig *fetcherConfig.Config
|
fetcherConfig *fetcherConfig.Config
|
||||||
|
nsResolver *utils.NamespaceResolver
|
||||||
|
|
||||||
runtimeImagePullPolicy apiv1.PullPolicy
|
runtimeImagePullPolicy apiv1.PullPolicy
|
||||||
namespace string
|
|
||||||
useIstio bool
|
useIstio bool
|
||||||
|
|
||||||
fsCache *fscache.FunctionServiceCache // cache funcSvc's by function, address and pod name
|
fsCache *fscache.FunctionServiceCache // cache funcSvc's by function, address and pod name
|
||||||
@@ -100,7 +102,6 @@ func MakeNewDeploy(
|
|||||||
logger *zap.Logger,
|
logger *zap.Logger,
|
||||||
fissionClient versioned.Interface,
|
fissionClient versioned.Interface,
|
||||||
kubernetesClient kubernetes.Interface,
|
kubernetesClient kubernetes.Interface,
|
||||||
namespace string,
|
|
||||||
fetcherConfig *fetcherConfig.Config,
|
fetcherConfig *fetcherConfig.Config,
|
||||||
instanceID string,
|
instanceID string,
|
||||||
funcInformer map[string]finformerv1.FunctionInformer,
|
funcInformer map[string]finformerv1.FunctionInformer,
|
||||||
@@ -124,10 +125,9 @@ func MakeNewDeploy(
|
|||||||
fissionClient: fissionClient,
|
fissionClient: fissionClient,
|
||||||
kubernetesClient: kubernetesClient,
|
kubernetesClient: kubernetesClient,
|
||||||
instanceID: instanceID,
|
instanceID: instanceID,
|
||||||
|
fsCache: fscache.MakeFunctionServiceCache(logger),
|
||||||
namespace: namespace,
|
throttler: throttler.MakeThrottler(1 * time.Minute),
|
||||||
fsCache: fscache.MakeFunctionServiceCache(logger),
|
nsResolver: utils.DefaultNSResolver(),
|
||||||
throttler: throttler.MakeThrottler(1 * time.Minute),
|
|
||||||
|
|
||||||
fetcherConfig: fetcherConfig,
|
fetcherConfig: fetcherConfig,
|
||||||
runtimeImagePullPolicy: utils.GetImagePullPolicy(os.Getenv("RUNTIME_IMAGE_PULL_POLICY")),
|
runtimeImagePullPolicy: utils.GetImagePullPolicy(os.Getenv("RUNTIME_IMAGE_PULL_POLICY")),
|
||||||
@@ -428,10 +428,7 @@ func (deploy *NewDeploy) fnCreate(ctx context.Context, fn *fv1.Function) (*fscac
|
|||||||
|
|
||||||
// to support backward compatibility, if the function was created in default ns, we fall back to creating the
|
// to support backward compatibility, if the function was created in default ns, we fall back to creating the
|
||||||
// deployment of the function in fission-function ns
|
// deployment of the function in fission-function ns
|
||||||
ns := deploy.namespace
|
ns := deploy.nsResolver.GetFunctionNS(fn.ObjectMeta.Namespace)
|
||||||
if fn.ObjectMeta.Namespace != metav1.NamespaceDefault {
|
|
||||||
ns = fn.ObjectMeta.Namespace
|
|
||||||
}
|
|
||||||
|
|
||||||
// Envoy(istio-proxy) returns 404 directly before istio pilot
|
// Envoy(istio-proxy) returns 404 directly before istio pilot
|
||||||
// propagates latest Envoy-specific configuration.
|
// propagates latest Envoy-specific configuration.
|
||||||
@@ -549,10 +546,7 @@ func (deploy *NewDeploy) updateFunction(ctx context.Context, oldFn *fv1.Function
|
|||||||
|
|
||||||
// to support backward compatibility, if the function was created in default ns, we fall back to creating the
|
// to support backward compatibility, if the function was created in default ns, we fall back to creating the
|
||||||
// deployment of the function in fission-function ns, so cleaning up resources there
|
// deployment of the function in fission-function ns, so cleaning up resources there
|
||||||
ns := deploy.namespace
|
ns := deploy.nsResolver.GetFunctionNS(newFn.ObjectMeta.Namespace)
|
||||||
if newFn.ObjectMeta.Namespace != metav1.NamespaceDefault {
|
|
||||||
ns = newFn.ObjectMeta.Namespace
|
|
||||||
}
|
|
||||||
|
|
||||||
fsvc, err := deploy.fsCache.GetByFunctionUID(newFn.ObjectMeta.UID)
|
fsvc, err := deploy.fsCache.GetByFunctionUID(newFn.ObjectMeta.UID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -654,10 +648,7 @@ func (deploy *NewDeploy) updateFuncDeployment(ctx context.Context, fn *fv1.Funct
|
|||||||
|
|
||||||
// to support backward compatibility, if the function was created in default ns, we fall back to creating the
|
// to support backward compatibility, if the function was created in default ns, we fall back to creating the
|
||||||
// deployment of the function in fission-function ns
|
// deployment of the function in fission-function ns
|
||||||
ns := deploy.namespace
|
ns := deploy.nsResolver.GetFunctionNS(fn.ObjectMeta.Namespace)
|
||||||
if fn.ObjectMeta.Namespace != metav1.NamespaceDefault {
|
|
||||||
ns = fn.ObjectMeta.Namespace
|
|
||||||
}
|
|
||||||
|
|
||||||
existingDepl, err := deploy.kubernetesClient.AppsV1().Deployments(ns).Get(ctx, fnObjName, metav1.GetOptions{})
|
existingDepl, err := deploy.kubernetesClient.AppsV1().Deployments(ns).Get(ctx, fnObjName, metav1.GetOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -708,10 +699,7 @@ func (deploy *NewDeploy) fnDelete(ctx context.Context, fn *fv1.Function) error {
|
|||||||
|
|
||||||
// to support backward compatibility, if the function was created in default ns, we fall back to creating the
|
// to support backward compatibility, if the function was created in default ns, we fall back to creating the
|
||||||
// deployment of the function in fission-function ns, so cleaning up resources there
|
// deployment of the function in fission-function ns, so cleaning up resources there
|
||||||
ns := deploy.namespace
|
ns := deploy.nsResolver.GetFunctionNS(fn.ObjectMeta.Namespace)
|
||||||
if fn.ObjectMeta.Namespace != metav1.NamespaceDefault {
|
|
||||||
ns = fn.ObjectMeta.Namespace
|
|
||||||
}
|
|
||||||
|
|
||||||
err = deploy.cleanupNewdeploy(ctx, ns, objName)
|
err = deploy.cleanupNewdeploy(ctx, ns, objName)
|
||||||
multierr = multierror.Append(multierr, err)
|
multierr = multierror.Append(multierr, err)
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ import (
|
|||||||
const (
|
const (
|
||||||
defaultNamespace string = "default"
|
defaultNamespace string = "default"
|
||||||
functionNamespace string = "fission-function"
|
functionNamespace string = "fission-function"
|
||||||
|
builderNamespace string = "fission-builder"
|
||||||
envName string = "newdeploy-test-env"
|
envName string = "newdeploy-test-env"
|
||||||
functionName string = "newdeploy-test-func"
|
functionName string = "newdeploy-test-func"
|
||||||
configmapName string = "newdeploy-test-configmap"
|
configmapName string = "newdeploy-test-configmap"
|
||||||
@@ -80,7 +81,7 @@ func TestRefreshFuncPods(t *testing.T) {
|
|||||||
t.Fatalf("Error creating fetcher config: %s", err)
|
t.Fatalf("Error creating fetcher config: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
executor, err := MakeNewDeploy(ctx, logger, fissionClient, kubernetesClient, functionNamespace, fetcherConfig, "test",
|
executor, err := MakeNewDeploy(ctx, logger, fissionClient, kubernetesClient, fetcherConfig, "test",
|
||||||
funcInformer, envInformer, deployInformer, svcInformer, podSpecPatch)
|
funcInformer, envInformer, deployInformer, svcInformer, podSpecPatch)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("new deploy manager creation failed: %s", err)
|
t.Fatalf("new deploy manager creation failed: %s", err)
|
||||||
@@ -88,6 +89,12 @@ func TestRefreshFuncPods(t *testing.T) {
|
|||||||
|
|
||||||
ndm := executor.(*NewDeploy)
|
ndm := executor.(*NewDeploy)
|
||||||
|
|
||||||
|
nsResolver := utils.NamespaceResolver{
|
||||||
|
FunctionNamespace: functionNamespace,
|
||||||
|
BuiderNamespace: builderNamespace,
|
||||||
|
}
|
||||||
|
ndm.nsResolver = &nsResolver
|
||||||
|
|
||||||
go ndm.Run(ctx)
|
go ndm.Run(ctx)
|
||||||
t.Log("New deploy manager started")
|
t.Log("New deploy manager started")
|
||||||
|
|
||||||
|
|||||||
@@ -62,7 +62,6 @@ type (
|
|||||||
env *fv1.Environment
|
env *fv1.Environment
|
||||||
deployment *appsv1.Deployment // kubernetes deployment
|
deployment *appsv1.Deployment // kubernetes deployment
|
||||||
namespace string // namespace to keep our resources
|
namespace string // namespace to keep our resources
|
||||||
functionNamespace string // fallback namespace for fission functions
|
|
||||||
podReadyTimeout time.Duration // timeout for generic pods to become ready
|
podReadyTimeout time.Duration // timeout for generic pods to become ready
|
||||||
fsCache *fscache.FunctionServiceCache // cache funcSvc's by function, address and podname
|
fsCache *fscache.FunctionServiceCache // cache funcSvc's by function, address and podname
|
||||||
useSvc bool // create k8s service for specialized pods
|
useSvc bool // create k8s service for specialized pods
|
||||||
@@ -92,7 +91,6 @@ func MakeGenericPool(
|
|||||||
metricsClient metricsclient.Interface,
|
metricsClient metricsclient.Interface,
|
||||||
env *fv1.Environment,
|
env *fv1.Environment,
|
||||||
namespace string,
|
namespace string,
|
||||||
functionNamespace string,
|
|
||||||
fsCache *fscache.FunctionServiceCache,
|
fsCache *fscache.FunctionServiceCache,
|
||||||
fetcherConfig *fetcherConfig.Config,
|
fetcherConfig *fetcherConfig.Config,
|
||||||
instanceID string,
|
instanceID string,
|
||||||
@@ -122,7 +120,6 @@ func MakeGenericPool(
|
|||||||
kubernetesClient: kubernetesClient,
|
kubernetesClient: kubernetesClient,
|
||||||
metricsClient: metricsClient,
|
metricsClient: metricsClient,
|
||||||
namespace: namespace,
|
namespace: namespace,
|
||||||
functionNamespace: functionNamespace,
|
|
||||||
podReadyTimeout: podReadyTimeout,
|
podReadyTimeout: podReadyTimeout,
|
||||||
fsCache: fsCache,
|
fsCache: fsCache,
|
||||||
fetcherConfig: fetcherConfig,
|
fetcherConfig: fetcherConfig,
|
||||||
@@ -446,7 +443,7 @@ func (gp *GenericPool) createSvc(ctx context.Context, name string, labels map[st
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (gp *GenericPool) getFuncSvc(ctx context.Context, fn *fv1.Function) (*fscache.FuncSvc, error) {
|
func (gp *GenericPool) getFuncSvc(ctx context.Context, fn *fv1.Function) (*fscache.FuncSvc, error) {
|
||||||
logger := otelUtils.LoggerWithTraceID(ctx, gp.logger).With(zap.String("function", fn.ObjectMeta.Name), zap.String("functionNamespace", fn.ObjectMeta.Namespace),
|
logger := otelUtils.LoggerWithTraceID(ctx, gp.logger).With(zap.String("function", fn.ObjectMeta.Name), zap.String("namespace", fn.ObjectMeta.Namespace),
|
||||||
zap.String("env", fn.Spec.Environment.Name), zap.String("envNamespace", fn.Spec.Environment.Namespace))
|
zap.String("env", fn.Spec.Environment.Name), zap.String("envNamespace", fn.Spec.Environment.Namespace))
|
||||||
|
|
||||||
logger.Info("choosing pod from pool")
|
logger.Info("choosing pod from pool")
|
||||||
|
|||||||
@@ -58,7 +58,9 @@ import (
|
|||||||
otelUtils "github.com/fission/fission/pkg/utils/otel"
|
otelUtils "github.com/fission/fission/pkg/utils/otel"
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ executortype.ExecutorType = &GenericPoolManager{}
|
var (
|
||||||
|
_ executortype.ExecutorType = &GenericPoolManager{}
|
||||||
|
)
|
||||||
|
|
||||||
type requestType int
|
type requestType int
|
||||||
|
|
||||||
@@ -74,7 +76,7 @@ type (
|
|||||||
pools map[string]*GenericPool
|
pools map[string]*GenericPool
|
||||||
kubernetesClient kubernetes.Interface
|
kubernetesClient kubernetes.Interface
|
||||||
metricsClient metricsclient.Interface
|
metricsClient metricsclient.Interface
|
||||||
namespace string
|
nsResolver *utils.NamespaceResolver
|
||||||
|
|
||||||
fissionClient versioned.Interface
|
fissionClient versioned.Interface
|
||||||
functionEnv *cache.Cache
|
functionEnv *cache.Cache
|
||||||
@@ -116,7 +118,6 @@ func MakeGenericPoolManager(ctx context.Context,
|
|||||||
fissionClient versioned.Interface,
|
fissionClient versioned.Interface,
|
||||||
kubernetesClient kubernetes.Interface,
|
kubernetesClient kubernetes.Interface,
|
||||||
metricsClient metricsclient.Interface,
|
metricsClient metricsclient.Interface,
|
||||||
functionNamespace string,
|
|
||||||
fetcherConfig *fetcherConfig.Config,
|
fetcherConfig *fetcherConfig.Config,
|
||||||
instanceID string,
|
instanceID string,
|
||||||
funcInformer map[string]finformerv1.FunctionInformer,
|
funcInformer map[string]finformerv1.FunctionInformer,
|
||||||
@@ -138,15 +139,15 @@ func MakeGenericPoolManager(ctx context.Context,
|
|||||||
enableIstio = istio
|
enableIstio = istio
|
||||||
}
|
}
|
||||||
|
|
||||||
poolPodC := NewPoolPodController(ctx, gpmLogger, kubernetesClient, functionNamespace,
|
poolPodC := NewPoolPodController(ctx, gpmLogger, kubernetesClient,
|
||||||
enableIstio, funcInformer, pkgInformer, envInformer, rsInformer, podInformer)
|
enableIstio, funcInformer, pkgInformer, envInformer, rsInformer, podInformer)
|
||||||
|
|
||||||
gpm := &GenericPoolManager{
|
gpm := &GenericPoolManager{
|
||||||
logger: gpmLogger,
|
logger: gpmLogger,
|
||||||
pools: make(map[string]*GenericPool),
|
pools: make(map[string]*GenericPool),
|
||||||
kubernetesClient: kubernetesClient,
|
kubernetesClient: kubernetesClient,
|
||||||
|
nsResolver: utils.DefaultNSResolver(),
|
||||||
metricsClient: metricsClient,
|
metricsClient: metricsClient,
|
||||||
namespace: functionNamespace,
|
|
||||||
fissionClient: fissionClient,
|
fissionClient: fissionClient,
|
||||||
functionEnv: cache.MakeCache(10*time.Second, 0),
|
functionEnv: cache.MakeCache(10*time.Second, 0),
|
||||||
fsCache: fscache.MakeFunctionServiceCache(gpmLogger),
|
fsCache: fscache.MakeFunctionServiceCache(gpmLogger),
|
||||||
@@ -162,6 +163,8 @@ func MakeGenericPoolManager(ctx context.Context,
|
|||||||
gpm.podLister = podInformer.Lister()
|
gpm.podLister = podInformer.Lister()
|
||||||
gpm.podListerSynced = podInformer.Informer().HasSynced
|
gpm.podListerSynced = podInformer.Informer().HasSynced
|
||||||
|
|
||||||
|
gpm.logger.Debug("inside MakeGenericPoolManager")
|
||||||
|
|
||||||
return gpm, nil
|
return gpm, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -197,7 +200,7 @@ func (gpm *GenericPoolManager) GetFuncSvc(ctx context.Context, fn *fv1.Function)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if created {
|
if created {
|
||||||
logger.Info("created pool for the environment", zap.String("env", env.ObjectMeta.Name), zap.String("namespace", gpm.namespace))
|
logger.Info("created pool for the environment", zap.String("env", env.ObjectMeta.Name), zap.String("namespace", gpm.nsResolver.ResolveNamespace(gpm.nsResolver.FunctionNamespace)))
|
||||||
}
|
}
|
||||||
|
|
||||||
// from GenericPool -> get one function container
|
// from GenericPool -> get one function container
|
||||||
@@ -277,7 +280,7 @@ func (gpm *GenericPoolManager) RefreshFuncPods(ctx context.Context, logger *zap.
|
|||||||
}
|
}
|
||||||
|
|
||||||
if created {
|
if created {
|
||||||
gpm.logger.Info("created pool for the environment", zap.String("env", env.ObjectMeta.Name), zap.String("namespace", gpm.namespace))
|
gpm.logger.Info("created pool for the environment", zap.String("env", env.ObjectMeta.Name), zap.String("namespace", gpm.nsResolver.ResolveNamespace(gpm.nsResolver.FunctionNamespace)))
|
||||||
}
|
}
|
||||||
|
|
||||||
funcSvc, err := gp.fsCache.GetByFunction(&f.ObjectMeta)
|
funcSvc, err := gp.fsCache.GetByFunction(&f.ObjectMeta)
|
||||||
@@ -333,7 +336,7 @@ func (gpm *GenericPoolManager) AdoptExistingResources(ctx context.Context) {
|
|||||||
gpm.logger.Error("adopt pool failed", zap.Error(err))
|
gpm.logger.Error("adopt pool failed", zap.Error(err))
|
||||||
}
|
}
|
||||||
if created {
|
if created {
|
||||||
gpm.logger.Info("created pool for the environment", zap.String("env", env.ObjectMeta.Name), zap.String("namespace", gpm.namespace))
|
gpm.logger.Info("created pool for the environment", zap.String("env", env.ObjectMeta.Name), zap.String("namespace", gpm.nsResolver.ResolveNamespace(gpm.nsResolver.FunctionNamespace)))
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
@@ -482,12 +485,9 @@ func (gpm *GenericPoolManager) service() {
|
|||||||
if !ok {
|
if !ok {
|
||||||
// To support backward compatibility, if envs are created in default ns, we go ahead
|
// To support backward compatibility, if envs are created in default ns, we go ahead
|
||||||
// and create pools in fission-function ns as earlier.
|
// and create pools in fission-function ns as earlier.
|
||||||
ns := gpm.namespace
|
ns := gpm.nsResolver.GetFunctionNS(req.env.ObjectMeta.Namespace)
|
||||||
if req.env.ObjectMeta.Namespace != metav1.NamespaceDefault {
|
|
||||||
ns = req.env.ObjectMeta.Namespace
|
|
||||||
}
|
|
||||||
pool = MakeGenericPool(gpm.logger, gpm.fissionClient, gpm.kubernetesClient,
|
pool = MakeGenericPool(gpm.logger, gpm.fissionClient, gpm.kubernetesClient,
|
||||||
gpm.metricsClient, req.env, ns, gpm.namespace, gpm.fsCache,
|
gpm.metricsClient, req.env, ns, gpm.fsCache,
|
||||||
gpm.fetcherConfig, gpm.instanceID, gpm.enableIstio, gpm.podSpecPatch)
|
gpm.fetcherConfig, gpm.instanceID, gpm.enableIstio, gpm.podSpecPatch)
|
||||||
err = pool.setup(req.ctx)
|
err = pool.setup(req.ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -40,14 +40,15 @@ import (
|
|||||||
"github.com/fission/fission/pkg/executor/fscache"
|
"github.com/fission/fission/pkg/executor/fscache"
|
||||||
finformerv1 "github.com/fission/fission/pkg/generated/informers/externalversions/core/v1"
|
finformerv1 "github.com/fission/fission/pkg/generated/informers/externalversions/core/v1"
|
||||||
flisterv1 "github.com/fission/fission/pkg/generated/listers/core/v1"
|
flisterv1 "github.com/fission/fission/pkg/generated/listers/core/v1"
|
||||||
|
"github.com/fission/fission/pkg/utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
type (
|
type (
|
||||||
PoolPodController struct {
|
PoolPodController struct {
|
||||||
logger *zap.Logger
|
logger *zap.Logger
|
||||||
kubernetesClient kubernetes.Interface
|
kubernetesClient kubernetes.Interface
|
||||||
namespace string
|
|
||||||
enableIstio bool
|
enableIstio bool
|
||||||
|
nsResolver *utils.NamespaceResolver
|
||||||
|
|
||||||
envLister map[string]flisterv1.EnvironmentLister
|
envLister map[string]flisterv1.EnvironmentLister
|
||||||
envListerSynced map[string]k8sCache.InformerSynced
|
envListerSynced map[string]k8sCache.InformerSynced
|
||||||
@@ -69,7 +70,6 @@ type (
|
|||||||
|
|
||||||
func NewPoolPodController(ctx context.Context, logger *zap.Logger,
|
func NewPoolPodController(ctx context.Context, logger *zap.Logger,
|
||||||
kubernetesClient kubernetes.Interface,
|
kubernetesClient kubernetes.Interface,
|
||||||
namespace string,
|
|
||||||
enableIstio bool,
|
enableIstio bool,
|
||||||
funcInformer map[string]finformerv1.FunctionInformer,
|
funcInformer map[string]finformerv1.FunctionInformer,
|
||||||
pkgInformer map[string]finformerv1.PackageInformer,
|
pkgInformer map[string]finformerv1.PackageInformer,
|
||||||
@@ -79,8 +79,8 @@ func NewPoolPodController(ctx context.Context, logger *zap.Logger,
|
|||||||
logger = logger.Named("pool_pod_controller")
|
logger = logger.Named("pool_pod_controller")
|
||||||
p := &PoolPodController{
|
p := &PoolPodController{
|
||||||
logger: logger,
|
logger: logger,
|
||||||
|
nsResolver: utils.DefaultNSResolver(),
|
||||||
kubernetesClient: kubernetesClient,
|
kubernetesClient: kubernetesClient,
|
||||||
namespace: namespace,
|
|
||||||
enableIstio: enableIstio,
|
enableIstio: enableIstio,
|
||||||
envLister: make(map[string]flisterv1.EnvironmentLister, 0),
|
envLister: make(map[string]flisterv1.EnvironmentLister, 0),
|
||||||
envListerSynced: make(map[string]k8sCache.InformerSynced, 0),
|
envListerSynced: make(map[string]k8sCache.InformerSynced, 0),
|
||||||
@@ -89,10 +89,10 @@ func NewPoolPodController(ctx context.Context, logger *zap.Logger,
|
|||||||
spCleanupPodQueue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "SpecializedPodCleanupQueue"),
|
spCleanupPodQueue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "SpecializedPodCleanupQueue"),
|
||||||
}
|
}
|
||||||
for _, informer := range funcInformer {
|
for _, informer := range funcInformer {
|
||||||
informer.Informer().AddEventHandler(FunctionEventHandlers(ctx, p.logger, p.kubernetesClient, p.namespace, p.enableIstio))
|
informer.Informer().AddEventHandler(FunctionEventHandlers(ctx, p.logger, p.kubernetesClient, p.nsResolver.ResolveNamespace(p.nsResolver.FunctionNamespace), p.enableIstio))
|
||||||
}
|
}
|
||||||
for _, informer := range pkgInformer {
|
for _, informer := range pkgInformer {
|
||||||
informer.Informer().AddEventHandler(PackageEventHandlers(ctx, p.logger, p.kubernetesClient, p.namespace))
|
informer.Informer().AddEventHandler(PackageEventHandlers(ctx, p.logger, p.kubernetesClient, p.nsResolver.ResolveNamespace(p.nsResolver.FunctionNamespace)))
|
||||||
}
|
}
|
||||||
for ns, informer := range envInformer {
|
for ns, informer := range envInformer {
|
||||||
informer.Informer().AddEventHandler(k8sCache.ResourceEventHandlerFuncs{
|
informer.Informer().AddEventHandler(k8sCache.ResourceEventHandlerFuncs{
|
||||||
@@ -373,7 +373,7 @@ func (p *PoolPodController) envDeleteQueueProcessFunc(ctx context.Context) bool
|
|||||||
p.logger.Debug("env delete request processing")
|
p.logger.Debug("env delete request processing")
|
||||||
p.gpm.cleanupPool(ctx, env)
|
p.gpm.cleanupPool(ctx, env)
|
||||||
specializePodLables := getSpecializedPodLabels(env)
|
specializePodLables := getSpecializedPodLabels(env)
|
||||||
specializedPods, err := p.podLister.Pods(p.gpm.namespace).List(labels.SelectorFromSet(specializePodLables))
|
specializedPods, err := p.podLister.Pods(p.nsResolver.ResolveNamespace(p.nsResolver.FunctionNamespace)).List(labels.SelectorFromSet(specializePodLables))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
p.logger.Error("failed to list specialized pods", zap.Error(err))
|
p.logger.Error("failed to list specialized pods", zap.Error(err))
|
||||||
p.envDeleteQueue.Forget(obj)
|
p.envDeleteQueue.Forget(obj)
|
||||||
|
|||||||
@@ -68,8 +68,7 @@ func TestPoolPodControllerPodCleanup(t *testing.T) {
|
|||||||
gpmPodInformer := gpmInformerFactory.Core().V1().Pods()
|
gpmPodInformer := gpmInformerFactory.Core().V1().Pods()
|
||||||
gpmRsInformer := gpmInformerFactory.Apps().V1().ReplicaSets()
|
gpmRsInformer := gpmInformerFactory.Apps().V1().ReplicaSets()
|
||||||
|
|
||||||
fnNamespace := "fission-function"
|
ppc := NewPoolPodController(ctx, logger, kubernetesClient, false,
|
||||||
ppc := NewPoolPodController(ctx, logger, kubernetesClient, fnNamespace, false,
|
|
||||||
funcInformer,
|
funcInformer,
|
||||||
pkgInformer,
|
pkgInformer,
|
||||||
envInformer,
|
envInformer,
|
||||||
@@ -85,7 +84,7 @@ func TestPoolPodControllerPodCleanup(t *testing.T) {
|
|||||||
executor, err := MakeGenericPoolManager(ctx,
|
executor, err := MakeGenericPoolManager(ctx,
|
||||||
logger,
|
logger,
|
||||||
fissionClient, kubernetesClient, metricsClient,
|
fissionClient, kubernetesClient, metricsClient,
|
||||||
fnNamespace, fetcherConfig, executorInstanceID,
|
fetcherConfig, executorInstanceID,
|
||||||
funcInformer, pkgInformer, envInformer,
|
funcInformer, pkgInformer, envInformer,
|
||||||
gpmPodInformer, gpmRsInformer, nil)
|
gpmPodInformer, gpmRsInformer, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -184,7 +184,8 @@ func CleanupHpa(ctx context.Context, logger *zap.Logger, client kubernetes.Inter
|
|||||||
|
|
||||||
// CleanupRoleBindings periodically lists rolebindings across all namespaces and removes Service Accounts from them or
|
// CleanupRoleBindings periodically lists rolebindings across all namespaces and removes Service Accounts from them or
|
||||||
// deletes the rolebindings completely if there are no Service Accounts in a rolebinding object.
|
// deletes the rolebindings completely if there are no Service Accounts in a rolebinding object.
|
||||||
func CleanupRoleBindings(ctx context.Context, logger *zap.Logger, client kubernetes.Interface, fissionClient versioned.Interface, functionNs, envBuilderNs string, cleanupRoleBindingInterval time.Duration) {
|
func CleanupRoleBindings(ctx context.Context, logger *zap.Logger, client kubernetes.Interface, fissionClient versioned.Interface, cleanupRoleBindingInterval time.Duration) {
|
||||||
|
nsResolver := utils.DefaultNSResolver()
|
||||||
for {
|
for {
|
||||||
// some sleep before the next reaper iteration
|
// some sleep before the next reaper iteration
|
||||||
time.Sleep(cleanupRoleBindingInterval)
|
time.Sleep(cleanupRoleBindingInterval)
|
||||||
@@ -238,8 +239,8 @@ func CleanupRoleBindings(ctx context.Context, logger *zap.Logger, client kuberne
|
|||||||
// so now we need to look for the objects in default namespace.
|
// so now we need to look for the objects in default namespace.
|
||||||
saNs := subj.Namespace
|
saNs := subj.Namespace
|
||||||
isInReservedNS := false
|
isInReservedNS := false
|
||||||
if subj.Namespace == functionNs ||
|
if subj.Namespace == nsResolver.FunctionNamespace ||
|
||||||
subj.Namespace == envBuilderNs {
|
subj.Namespace == nsResolver.BuiderNamespace {
|
||||||
saNs = metav1.NamespaceDefault
|
saNs = metav1.NamespaceDefault
|
||||||
isInReservedNS = true
|
isInReservedNS = true
|
||||||
}
|
}
|
||||||
@@ -249,7 +250,8 @@ func CleanupRoleBindings(ctx context.Context, logger *zap.Logger, client kuberne
|
|||||||
for _, fn := range funcList.Items {
|
for _, fn := range funcList.Items {
|
||||||
if fn.Spec.Environment.Namespace == saNs ||
|
if fn.Spec.Environment.Namespace == saNs ||
|
||||||
// For the case that the environment is created in the reserved namespace.
|
// For the case that the environment is created in the reserved namespace.
|
||||||
(isInReservedNS && (fn.Spec.Environment.Namespace == functionNs || fn.Spec.Environment.Namespace == envBuilderNs)) {
|
(isInReservedNS && (fn.Spec.Environment.Namespace == nsResolver.FunctionNamespace ||
|
||||||
|
fn.Spec.Environment.Namespace == nsResolver.BuiderNamespace)) {
|
||||||
funcEnvReference = true
|
funcEnvReference = true
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,63 @@
|
|||||||
|
package utils
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
ENV_FUNCTION_NAMESPACE string = "FISSION_FUNCTION_NAMESPACE"
|
||||||
|
ENV_BUILDER_NAMESPACE string = "FISSION_BUILDER_NAMESPACE"
|
||||||
|
ENV_DEFAULT_NAMESPACE string = "FISSION_DEFAULT_NAMESPACE"
|
||||||
|
)
|
||||||
|
|
||||||
|
type NamespaceResolver struct {
|
||||||
|
FunctionNamespace string
|
||||||
|
BuiderNamespace string
|
||||||
|
DefaultNamespace string
|
||||||
|
}
|
||||||
|
|
||||||
|
var nsResolver *NamespaceResolver
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
nsResolver = &NamespaceResolver{
|
||||||
|
FunctionNamespace: os.Getenv(ENV_FUNCTION_NAMESPACE),
|
||||||
|
BuiderNamespace: os.Getenv(ENV_BUILDER_NAMESPACE),
|
||||||
|
DefaultNamespace: os.Getenv(ENV_DEFAULT_NAMESPACE),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (nsr *NamespaceResolver) GetBuilderNS(namespace string) string {
|
||||||
|
if nsr.FunctionNamespace == "" || nsr.BuiderNamespace == "" {
|
||||||
|
return namespace
|
||||||
|
}
|
||||||
|
|
||||||
|
if namespace != metav1.NamespaceDefault {
|
||||||
|
return namespace
|
||||||
|
}
|
||||||
|
return nsr.BuiderNamespace
|
||||||
|
}
|
||||||
|
|
||||||
|
func (nsr *NamespaceResolver) GetFunctionNS(namespace string) string {
|
||||||
|
if nsr.FunctionNamespace == "" || nsr.BuiderNamespace == "" {
|
||||||
|
return namespace
|
||||||
|
}
|
||||||
|
|
||||||
|
if namespace != metav1.NamespaceDefault {
|
||||||
|
return namespace
|
||||||
|
}
|
||||||
|
return nsr.FunctionNamespace
|
||||||
|
}
|
||||||
|
|
||||||
|
func (nsr *NamespaceResolver) ResolveNamespace(namespace string) string {
|
||||||
|
if nsr.FunctionNamespace == "" || nsr.BuiderNamespace == "" {
|
||||||
|
return nsr.DefaultNamespace
|
||||||
|
}
|
||||||
|
return namespace
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetFissionNamespaces => return all fission core component namespaces
|
||||||
|
func DefaultNSResolver() *NamespaceResolver {
|
||||||
|
return nsResolver
|
||||||
|
}
|
||||||
@@ -0,0 +1,124 @@
|
|||||||
|
package utils
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestNamespaceResolver(t *testing.T) {
|
||||||
|
t.Run("GetBuilderNS", func(t *testing.T) {
|
||||||
|
for _, test := range []struct {
|
||||||
|
name string
|
||||||
|
namespaceResolver *NamespaceResolver
|
||||||
|
namespace string
|
||||||
|
expected string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "should return fission-builder namespace",
|
||||||
|
namespaceResolver: getFissionNamespaces("fission-builder", "fission-function", "default"),
|
||||||
|
namespace: "default",
|
||||||
|
expected: "fission-builder",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "should return testns2 namespace",
|
||||||
|
namespaceResolver: getFissionNamespaces("fission-builder", "fission-function", "testns"),
|
||||||
|
namespace: "testns2",
|
||||||
|
expected: "testns2",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "should return testns3 namespace",
|
||||||
|
namespaceResolver: getFissionNamespaces("", "", "testns"),
|
||||||
|
namespace: "testns3",
|
||||||
|
expected: "testns3",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "should return default namespace",
|
||||||
|
namespaceResolver: getFissionNamespaces("fission-builder", "", "default"),
|
||||||
|
namespace: "default",
|
||||||
|
expected: "default",
|
||||||
|
},
|
||||||
|
} {
|
||||||
|
t.Run(test.name, func(t *testing.T) {
|
||||||
|
ns := test.namespaceResolver.GetBuilderNS(test.namespace)
|
||||||
|
if ns != test.expected {
|
||||||
|
t.Errorf("expected builder namespace %s, got %s", test.expected, ns)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("GetFunctionNS", func(t *testing.T) {
|
||||||
|
for _, test := range []struct {
|
||||||
|
name string
|
||||||
|
namespaceResolver *NamespaceResolver
|
||||||
|
namespace string
|
||||||
|
expected string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "should return fission-function namespace",
|
||||||
|
namespaceResolver: getFissionNamespaces("fission-builder", "fission-function", "default"),
|
||||||
|
namespace: "default",
|
||||||
|
expected: "fission-function",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "should return testns2 namespace",
|
||||||
|
namespaceResolver: getFissionNamespaces("fission-builder", "fission-function", "testns"),
|
||||||
|
namespace: "testns2",
|
||||||
|
expected: "testns2",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "should return testns3 namespace",
|
||||||
|
namespaceResolver: getFissionNamespaces("", "", "testns"),
|
||||||
|
namespace: "testns3",
|
||||||
|
expected: "testns3",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "should return default namespace",
|
||||||
|
namespaceResolver: getFissionNamespaces("", "fission-function", "default"),
|
||||||
|
namespace: "default",
|
||||||
|
expected: "default",
|
||||||
|
},
|
||||||
|
} {
|
||||||
|
t.Run(test.name, func(t *testing.T) {
|
||||||
|
ns := test.namespaceResolver.GetFunctionNS(test.namespace)
|
||||||
|
if ns != test.expected {
|
||||||
|
t.Errorf("expected function namespace %s, got %s", test.expected, ns)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("ResolveNamespace", func(t *testing.T) {
|
||||||
|
for _, test := range []struct {
|
||||||
|
name string
|
||||||
|
namespaceResolver *NamespaceResolver
|
||||||
|
namespace string
|
||||||
|
expected string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "should return testns namespace",
|
||||||
|
namespaceResolver: getFissionNamespaces("fission-builder", "fission-function", "default"),
|
||||||
|
namespace: "testns",
|
||||||
|
expected: "testns",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "should return default namespace",
|
||||||
|
namespaceResolver: getFissionNamespaces("fission-builder", "", "default"),
|
||||||
|
namespace: "testns",
|
||||||
|
expected: "default",
|
||||||
|
},
|
||||||
|
} {
|
||||||
|
t.Run(test.name, func(t *testing.T) {
|
||||||
|
ns := test.namespaceResolver.ResolveNamespace(test.namespace)
|
||||||
|
if ns != test.expected {
|
||||||
|
t.Errorf("expected function namespace %s, got %s", test.expected, ns)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func getFissionNamespaces(builderNS, functionNS, defaultNS string) *NamespaceResolver {
|
||||||
|
return &NamespaceResolver{
|
||||||
|
FunctionNamespace: functionNS,
|
||||||
|
BuiderNamespace: builderNS,
|
||||||
|
DefaultNamespace: defaultNS,
|
||||||
|
}
|
||||||
|
}
|
||||||
+2
-2
@@ -14,8 +14,8 @@ echo "source test_utils done"
|
|||||||
|
|
||||||
dump_system_info
|
dump_system_info
|
||||||
|
|
||||||
export FUNCTION_NAMESPACE=fission-function
|
export FUNCTION_NAMESPACE=default
|
||||||
export BUILDER_NAMESPACE=fission-builder
|
export BUILDER_NAMESPACE=default
|
||||||
export FISSION_NAMESPACE=fission
|
export FISSION_NAMESPACE=fission
|
||||||
export FISSION_ROUTER=127.0.0.1:8888
|
export FISSION_ROUTER=127.0.0.1:8888
|
||||||
export NODE_RUNTIME_IMAGE=fission/node-env-14
|
export NODE_RUNTIME_IMAGE=fission/node-env-14
|
||||||
|
|||||||
Reference in New Issue
Block a user