// Copyright 2018 The Operator-SDK Authors // // 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 utils import ( "fmt" "os" "strings" "github.com/1Password/onepassword-operator/pkg/logs" logf "sigs.k8s.io/controller-runtime/pkg/log" ) var ForceRunModeEnv = "OSDK_FORCE_RUN_MODE" type RunModeType string const ( LocalRunMode RunModeType = "local" ClusterRunMode RunModeType = "cluster" ) var log = logf.Log.WithName("k8sutil") // ErrNoNamespace indicates that a namespace could not be found for the current // environment var ErrNoNamespace = fmt.Errorf("namespace not found for current environment") // ErrRunLocal indicates that the operator is set to run in local mode (this error // is returned by functions that only work on operators running in cluster mode) var ErrRunLocal = fmt.Errorf("operator run mode forced to local") // GetOperatorNamespace returns the namespace the operator should be running in. func GetOperatorNamespace() (string, error) { if isRunModeLocal() { return "", ErrRunLocal } nsBytes, err := os.ReadFile("/var/run/secrets/kubernetes.io/serviceaccount/namespace") if err != nil { if os.IsNotExist(err) { return "", ErrNoNamespace } return "", err } ns := strings.TrimSpace(string(nsBytes)) log.V(int(logs.DebugLevel)).Info("Found namespace", "Namespace", ns) return ns, nil } func isRunModeLocal() bool { return os.Getenv(ForceRunModeEnv) == string(LocalRunMode) }