Files
kubevela/pkg/utils/system/system.go
2022-09-28 10:19:28 +08:00

172 lines
4.2 KiB
Go

/*
Copyright 2021 The KubeVela 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 system
import (
"os"
"path/filepath"
"github.com/pkg/errors"
"github.com/oam-dev/kubevela/apis/types"
"github.com/oam-dev/kubevela/pkg/oam"
)
const defaultVelaHome = ".vela"
const (
// VelaHomeEnv defines vela home system env
VelaHomeEnv = "VELA_HOME"
// StorageDriverEnv defines vela storage driver env
StorageDriverEnv = "STORAGE_DRIVER"
)
// GetVelaHomeDir return vela home dir
func GetVelaHomeDir() (string, error) {
var velaHome string
if custom := os.Getenv(VelaHomeEnv); custom != "" {
velaHome = custom
} else {
home, err := os.UserHomeDir()
if err != nil {
return "", err
}
velaHome = filepath.Join(home, defaultVelaHome)
}
if _, err := os.Stat(velaHome); err != nil && os.IsNotExist(err) {
err := os.MkdirAll(velaHome, 0750)
if err != nil {
return "", errors.Wrap(err, "error when create vela home directory")
}
}
return velaHome, nil
}
// GetDefaultFrontendDir return default vela frontend dir
func GetDefaultFrontendDir() (string, error) {
home, err := GetVelaHomeDir()
if err != nil {
return "", err
}
return filepath.Join(home, "frontend"), nil
}
// GetCapCenterDir return cap center dir
func GetCapCenterDir() (string, error) {
home, err := GetVelaHomeDir()
if err != nil {
return "", err
}
return filepath.Join(home, "centers"), nil
}
// GetRepoConfig return repo config
func GetRepoConfig() (string, error) {
home, err := GetCapCenterDir()
if err != nil {
return "", err
}
return filepath.Join(home, "config.yaml"), nil
}
// GetCapabilityDir return capability dirs including workloads and traits
func GetCapabilityDir() (string, error) {
home, err := GetVelaHomeDir()
if err != nil {
return "", err
}
return filepath.Join(home, "capabilities"), nil
}
// GetCurrentEnvPath return current env config
func GetCurrentEnvPath() (string, error) {
homedir, err := GetVelaHomeDir()
if err != nil {
return "", err
}
envPath := filepath.Join(homedir, "curenv")
return envPath, nil
}
// InitDirs create dir if not exits
func InitDirs() error {
if err := InitCapabilityDir(); err != nil {
return err
}
if err := InitCapCenterDir(); err != nil {
return err
}
return nil
}
// InitCapCenterDir create dir if not exits
func InitCapCenterDir() error {
home, err := GetCapCenterDir()
if err != nil {
return err
}
_, err = CreateIfNotExist(filepath.Join(home, ".tmp"))
return err
}
// InitCapabilityDir create dir if not exits
func InitCapabilityDir() error {
dir, err := GetCapabilityDir()
if err != nil {
return err
}
_, err = CreateIfNotExist(dir)
return err
}
// CreateIfNotExist create dir if not exist
func CreateIfNotExist(dir string) (bool, error) {
_, err := os.Stat(dir)
if err != nil {
if os.IsNotExist(err) {
// nolint:gosec
return false, os.MkdirAll(dir, 0755)
}
return false, err
}
return true, nil
}
const (
// LegacyKubeVelaSystemNamespaceEnv the legacy environment variable for kubevela system namespace
LegacyKubeVelaSystemNamespaceEnv = "DEFAULT_VELA_NS"
// KubeVelaSystemNamespaceEnv the environment variable for kubevela system namespace
KubeVelaSystemNamespaceEnv = "KUBEVELA_SYSTEM_NAMESPACE"
// KubeVelaDefinitionNamespaceEnv the environment variable for kubevela definition namespace
KubeVelaDefinitionNamespaceEnv = "KUBEVELA_DEFINITION_NAMESPACE"
)
func bindEnv(variable *string, keys ...string) {
for _, key := range keys {
if val := os.Getenv(key); val != "" {
*variable = val
return
}
}
}
// BindEnvironmentVariables bind
func BindEnvironmentVariables() {
bindEnv(&types.DefaultKubeVelaNS, KubeVelaSystemNamespaceEnv, LegacyKubeVelaSystemNamespaceEnv)
bindEnv(&oam.SystemDefinitionNamespace, KubeVelaDefinitionNamespaceEnv, KubeVelaSystemNamespaceEnv)
}