|
|
@@ -61,6 +61,7 @@ type AWS struct {
|
|
|
ProjectID string
|
|
|
DownloadPricingDataLock sync.RWMutex
|
|
|
ReservedInstances []*AWSReservedInstance
|
|
|
+ Config *ProviderConfig
|
|
|
*CustomProvider
|
|
|
}
|
|
|
|
|
|
@@ -256,7 +257,7 @@ func (aws *AWS) GetManagementPlatform() (string, error) {
|
|
|
}
|
|
|
|
|
|
func (aws *AWS) GetConfig() (*CustomPricing, error) {
|
|
|
- c, err := GetCustomPricingData("aws.json")
|
|
|
+ c, err := aws.Config.GetCustomPricingData()
|
|
|
if c.Discount == "" {
|
|
|
c.Discount = "0%"
|
|
|
}
|
|
|
@@ -269,98 +270,75 @@ func (aws *AWS) GetConfig() (*CustomPricing, error) {
|
|
|
return c, nil
|
|
|
}
|
|
|
func (aws *AWS) UpdateConfigFromConfigMap(a map[string]string) (*CustomPricing, error) {
|
|
|
- c, err := GetCustomPricingData("aws.json")
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
-
|
|
|
- return configmapUpdate(c, configPathFor("aws.json"), a)
|
|
|
+ return aws.Config.UpdateFromMap(a)
|
|
|
}
|
|
|
|
|
|
func (aws *AWS) UpdateConfig(r io.Reader, updateType string) (*CustomPricing, error) {
|
|
|
- c, err := GetCustomPricingData("aws.json")
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
- if updateType == SpotInfoUpdateType {
|
|
|
- a := AwsSpotFeedInfo{}
|
|
|
- err := json.NewDecoder(r).Decode(&a)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
+ return aws.Config.Update(func(c *CustomPricing) error {
|
|
|
+ if updateType == SpotInfoUpdateType {
|
|
|
+ a := AwsSpotFeedInfo{}
|
|
|
+ err := json.NewDecoder(r).Decode(&a)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
- c.ServiceKeyName = a.ServiceKeyName
|
|
|
- c.ServiceKeySecret = a.ServiceKeySecret
|
|
|
- c.SpotDataPrefix = a.Prefix
|
|
|
- c.SpotDataBucket = a.BucketName
|
|
|
- c.ProjectID = a.AccountID
|
|
|
- c.SpotDataRegion = a.Region
|
|
|
- c.SpotLabel = a.SpotLabel
|
|
|
- c.SpotLabelValue = a.SpotLabelValue
|
|
|
-
|
|
|
- } else if updateType == AthenaInfoUpdateType {
|
|
|
- a := AwsAthenaInfo{}
|
|
|
- err := json.NewDecoder(r).Decode(&a)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
- c.AthenaBucketName = a.AthenaBucketName
|
|
|
- c.AthenaRegion = a.AthenaRegion
|
|
|
- c.AthenaDatabase = a.AthenaDatabase
|
|
|
- c.AthenaTable = a.AthenaTable
|
|
|
- c.ServiceKeyName = a.ServiceKeyName
|
|
|
- c.ServiceKeySecret = a.ServiceKeySecret
|
|
|
- c.ProjectID = a.AccountID
|
|
|
- } else {
|
|
|
- a := make(map[string]interface{})
|
|
|
- err = json.NewDecoder(r).Decode(&a)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
- for k, v := range a {
|
|
|
- kUpper := strings.Title(k) // Just so we consistently supply / receive the same values, uppercase the first letter.
|
|
|
- vstr, ok := v.(string)
|
|
|
- if ok {
|
|
|
- err := SetCustomPricingField(c, kUpper, vstr)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
- } else {
|
|
|
- sci := v.(map[string]interface{})
|
|
|
- sc := make(map[string]string)
|
|
|
- for k, val := range sci {
|
|
|
- sc[k] = val.(string)
|
|
|
+ c.ServiceKeyName = a.ServiceKeyName
|
|
|
+ c.ServiceKeySecret = a.ServiceKeySecret
|
|
|
+ c.SpotDataPrefix = a.Prefix
|
|
|
+ c.SpotDataBucket = a.BucketName
|
|
|
+ c.ProjectID = a.AccountID
|
|
|
+ c.SpotDataRegion = a.Region
|
|
|
+ c.SpotLabel = a.SpotLabel
|
|
|
+ c.SpotLabelValue = a.SpotLabelValue
|
|
|
+
|
|
|
+ } else if updateType == AthenaInfoUpdateType {
|
|
|
+ a := AwsAthenaInfo{}
|
|
|
+ err := json.NewDecoder(r).Decode(&a)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ c.AthenaBucketName = a.AthenaBucketName
|
|
|
+ c.AthenaRegion = a.AthenaRegion
|
|
|
+ c.AthenaDatabase = a.AthenaDatabase
|
|
|
+ c.AthenaTable = a.AthenaTable
|
|
|
+ c.ServiceKeyName = a.ServiceKeyName
|
|
|
+ c.ServiceKeySecret = a.ServiceKeySecret
|
|
|
+ c.ProjectID = a.AccountID
|
|
|
+ } else {
|
|
|
+ a := make(map[string]interface{})
|
|
|
+ err := json.NewDecoder(r).Decode(&a)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ for k, v := range a {
|
|
|
+ kUpper := strings.Title(k) // Just so we consistently supply / receive the same values, uppercase the first letter.
|
|
|
+ vstr, ok := v.(string)
|
|
|
+ if ok {
|
|
|
+ err := SetCustomPricingField(c, kUpper, vstr)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ sci := v.(map[string]interface{})
|
|
|
+ sc := make(map[string]string)
|
|
|
+ for k, val := range sci {
|
|
|
+ sc[k] = val.(string)
|
|
|
+ }
|
|
|
+ c.SharedCosts = sc //todo: support reflection/multiple map fields
|
|
|
}
|
|
|
- c.SharedCosts = sc //todo: support reflection/multiple map fields
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
- cj, err := json.Marshal(c)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
|
|
|
- path := configPathFor("aws.json")
|
|
|
-
|
|
|
- remoteEnabled := os.Getenv(remoteEnabled)
|
|
|
- if remoteEnabled == "true" {
|
|
|
- err = UpdateClusterMeta(os.Getenv(clusterIDKey), c.ClusterName)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
+ remoteEnabled := os.Getenv(remoteEnabled)
|
|
|
+ if remoteEnabled == "true" {
|
|
|
+ err := UpdateClusterMeta(os.Getenv(clusterIDKey), c.ClusterName)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- configLock.Lock()
|
|
|
- err = ioutil.WriteFile(path, cj, 0644)
|
|
|
- configLock.Unlock()
|
|
|
-
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
- return c, nil
|
|
|
+ return nil
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
type awsKey struct {
|
|
|
@@ -477,7 +455,7 @@ func (aws *AWS) isPreemptible(key string) bool {
|
|
|
func (aws *AWS) DownloadPricingData() error {
|
|
|
aws.DownloadPricingDataLock.Lock()
|
|
|
defer aws.DownloadPricingDataLock.Unlock()
|
|
|
- c, err := GetCustomPricingData("aws.json")
|
|
|
+ c, err := aws.Config.GetCustomPricingData()
|
|
|
if err != nil {
|
|
|
klog.V(1).Infof("Error downloading default pricing data: %s", err.Error())
|
|
|
}
|
|
|
@@ -700,8 +678,8 @@ func (aws *AWS) DownloadPricingData() error {
|
|
|
}
|
|
|
|
|
|
// Stubbed NetworkPricing for AWS. Pull directly from aws.json for now
|
|
|
-func (c *AWS) NetworkPricing() (*Network, error) {
|
|
|
- cpricing, err := GetCustomPricingData("aws.json")
|
|
|
+func (aws *AWS) NetworkPricing() (*Network, error) {
|
|
|
+ cpricing, err := aws.Config.GetCustomPricingData()
|
|
|
if err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
|
@@ -875,10 +853,13 @@ func (awsProvider *AWS) ClusterInfo() (map[string]string, error) {
|
|
|
if len(maybeClusterId) != 0 {
|
|
|
return makeStructure(maybeClusterId)
|
|
|
}
|
|
|
- provIdRx := regexp.MustCompile("aws:///([^/]+)/([^/]+)")
|
|
|
- clusterIdRx := regexp.MustCompile("^kubernetes\\.io/cluster/([^/]+)")
|
|
|
- nodeList := awsProvider.Clientset.GetAllNodes()
|
|
|
- for _, n := range nodeList {
|
|
|
+ // TODO: This should be cached, it can take a long time to hit the API
|
|
|
+ //provIdRx := regexp.MustCompile("aws:///([^/]+)/([^/]+)")
|
|
|
+ //clusterIdRx := regexp.MustCompile("^kubernetes\\.io/cluster/([^/]+)")
|
|
|
+ //klog.Infof("nodelist get here %s", time.Now())
|
|
|
+ //nodeList := awsProvider.Clientset.GetAllNodes()
|
|
|
+ //klog.Infof("nodelist done here %s", time.Now())
|
|
|
+ /*for _, n := range nodeList {
|
|
|
region := ""
|
|
|
instanceId := ""
|
|
|
providerId := n.Spec.ProviderID
|
|
|
@@ -904,7 +885,7 @@ func (awsProvider *AWS) ClusterInfo() (map[string]string, error) {
|
|
|
},
|
|
|
})
|
|
|
if diErr != nil {
|
|
|
- // maybe log this?
|
|
|
+ klog.Infof("Error describing instances: %s", diErr)
|
|
|
continue
|
|
|
}
|
|
|
if len(di.Reservations) != 1 {
|
|
|
@@ -926,7 +907,7 @@ func (awsProvider *AWS) ClusterInfo() (map[string]string, error) {
|
|
|
return makeStructure(group)
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
+ }*/
|
|
|
klog.V(2).Infof("Unable to sniff out cluster ID, perhaps set $%s to force one", ClusterIdEnvVar)
|
|
|
return makeStructure(defaultClusterName)
|
|
|
}
|