)
type AzureInstanceSetConfig struct {
- SubscriptionID string "SubscriptionID"
- ClientID string "ClientID"
- ClientSecret string "ClientSecret"
- TenantID string "TenantID"
- CloudEnvironment string "CloudEnvironment"
- ResourceGroup string "ResourceGroup"
- Location string "Location"
- Network string "Network"
- Subnet string "Subnet"
- StorageAccount string "StorageAccount"
- BlobContainer string "BlobContainer"
- DeleteDanglingResourcesAfter float64 "DeleteDanglingResourcesAfter"
+ SubscriptionID string
+ ClientID string
+ ClientSecret string
+ TenantID string
+ CloudEnvironment string
+ ResourceGroup string
+ Location string
+ Network string
+ Subnet string
+ StorageAccount string
+ BlobContainer string
+ DeleteDanglingResourcesAfter arvados.Duration
}
type VirtualMachinesClientWrapper interface {
func NewAzureInstanceSet(config map[string]interface{}, dispatcherID cloud.InstanceSetID, logger logrus.FieldLogger) (prv cloud.InstanceSet, err error) {
azcfg := AzureInstanceSetConfig{}
- if err = mapstructure.Decode(config, &azcfg); err != nil {
+
+ decoderConfig := mapstructure.DecoderConfig{
+ DecodeHook: arvados.DurationMapStructureDecodeHook(),
+ Result: &azcfg}
+
+ decoder, err := mapstructure.NewDecoder(&decoderConfig)
+ if err != nil {
return nil, err
}
+ if err = decoder.Decode(config); err != nil {
+ return nil, err
+ }
+
ap := AzureInstanceSet{logger: logger}
err = ap.setup(azcfg, string(dispatcherID))
if err != nil {
if result.Value().Tags["created-at"] != nil {
createdAt, err := time.Parse(time.RFC3339Nano, *result.Value().Tags["created-at"])
if err == nil {
- if timestamp.Sub(createdAt).Seconds() > az.azconfig.DeleteDanglingResourcesAfter {
+ if timestamp.Sub(createdAt).Seconds() > az.azconfig.DeleteDanglingResourcesAfter.Duration().Seconds() {
az.logger.Printf("Will delete %v because it is older than %v s", *result.Value().Name, az.azconfig.DeleteDanglingResourcesAfter)
az.deleteNIC <- *result.Value().Name
}
if b.Properties.BlobType == storage.BlobTypePage &&
b.Properties.LeaseState == "available" &&
b.Properties.LeaseStatus == "unlocked" &&
- age.Seconds() > az.azconfig.DeleteDanglingResourcesAfter {
+ age.Seconds() > az.azconfig.DeleteDanglingResourcesAfter.Duration().Seconds() {
az.logger.Printf("Blob %v is unlocked and not modified for %v seconds, will delete", b.Name, age.Seconds())
az.deleteBlob <- b
import (
"encoding/json"
"fmt"
+ "reflect"
"time"
)
return time.Duration(d)
}
-// Value implements flag.Value
+// Set sets the current duration by parsing the string using time.ParseDuration
func (d *Duration) Set(s string) error {
dur, err := time.ParseDuration(s)
*d = Duration(dur)
return err
}
+
+// DurationMapStructureDecodeHook can be used to create a decoder for arvados.duration when using mapstructure
+func DurationMapStructureDecodeHook() interface{} {
+ return func(f reflect.Type, t reflect.Type, data interface{}) (interface{}, error) {
+ var duration Duration
+ if f.Kind() != reflect.String || t != reflect.TypeOf(duration) {
+ return data, nil
+ }
+
+ duration.Set(data.(string))
+ return duration, nil
+ }
+}