-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathconfig.go
116 lines (100 loc) · 2.95 KB
/
config.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package main
import (
"errors"
"log"
"os"
"os/user"
"path/filepath"
"github.com/caarlos0/env/v7"
"github.com/joho/godotenv"
"github.com/oracle/oci-go-sdk/v65/common"
"github.com/oracle/oci-go-sdk/v65/core"
)
type config struct {
Region string `env:"OCI_REGION"`
UserID string `env:"OCI_USER_ID"`
TenancyID string `env:"OCI_TENANCY_ID"`
KeyFingerprint string `env:"OCI_KEY_FINGERPRINT"`
PrivateKeyFilename string `env:"OCI_PRIVATE_KEY_FILENAME"`
SubnetID string `env:"OCI_SUBNET_ID"`
ImageID string `env:"OCI_IMAGE_ID"`
OCPUS float32 `env:"OCI_OCPUS"`
MemoryInGbs float32 `env:"OCI_MEMORY_IN_GBS"`
Shape string `env:"OCI_SHAPE"`
MaxInstances int `env:"OCI_MAX_INSTANCES" envDefault:"1"`
SSHPublicKey string `env:"OCI_SSH_PUBLIC_KEY"`
// Optional
AvailabilityDomains []string `env:"OCI_AVAILABILITY_DOMAIN" envSeparator:","`
BootVolumeSizeInGbs int64 `env:"OCI_BOOT_VOLUME_SIZE_IN_GBS"`
BootVolumeId string `env:"OCI_BOOT_VOLUME_ID"`
}
func (cfg config) validate() error {
if cfg.BootVolumeId != "" && cfg.BootVolumeSizeInGbs != 0 {
return errors.New("OCI_BOOT_VOLUME_ID and OCI_BOOT_VOLUME_SIZE_IN_GBS cannot be used together")
}
if cfg.BootVolumeId != "" && len(cfg.AvailabilityDomains) == 0 {
return errors.New("OCI_AVAILABILITY_DOMAIN must be specified as string if using OCI_BOOT_VOLUME_ID")
}
return nil
}
func (cfg config) buildConfigProvider() (common.ConfigurationProvider, error) {
pkPath, _ := expand(cfg.PrivateKeyFilename)
pk, err := os.ReadFile(pkPath)
if err != nil {
return nil, err
}
cp := common.NewRawConfigurationProvider(cfg.TenancyID, cfg.UserID, cfg.Region, cfg.KeyFingerprint, string(pk), nil)
if err != nil {
return nil, err
}
ok, err := common.IsConfigurationProviderValid(cp)
if err != nil {
return nil, err
}
if ok {
return cp, nil
}
log.Println("The config specified in .env is not valid, trying the default oci config")
cp = common.DefaultConfigProvider()
return cp, nil
}
func loadConfig() (config, error) {
err := godotenv.Load() // load .env file
if err != nil {
return config{}, err
}
cfg := config{}
if err := env.Parse(&cfg); err != nil {
return config{}, err
}
err = cfg.validate()
if err != nil {
return config{}, err
}
return cfg, nil
}
func buildSourceDetails(cfg config) core.InstanceSourceDetails {
if cfg.BootVolumeId != "" {
return core.InstanceSourceViaBootVolumeDetails{
BootVolumeId: &cfg.BootVolumeId,
}
}
var bootVolume *int64
if cfg.BootVolumeSizeInGbs > 0 {
bootVolume = &cfg.BootVolumeSizeInGbs
}
return core.InstanceSourceViaImageDetails{
ImageId: &cfg.ImageID,
BootVolumeSizeInGBs: bootVolume,
}
}
func expand(path string) (string, error) {
if len(path) == 0 || path[0] != '~' {
return path, nil
}
usr, err := user.Current()
if err != nil {
return "", err
}
return filepath.Join(usr.HomeDir, path[1:]), nil
}