@@ -5,11 +5,11 @@ import (
55 "context"
66 "errors"
77 "fmt"
8- "io/ioutil"
98 "net"
109 "os"
1110 "strings"
1211 "text/template"
12+ "time"
1313
1414 "github.com/docker/machine/libmachine/drivers"
1515 "github.com/docker/machine/libmachine/log"
@@ -19,6 +19,8 @@ import (
1919 "github.com/yandex-cloud/go-genproto/yandex/cloud/compute/v1"
2020 "github.com/yandex-cloud/go-genproto/yandex/cloud/resourcemanager/v1"
2121 "github.com/yandex-cloud/go-genproto/yandex/cloud/vpc/v1"
22+ ycsdk "github.com/yandex-cloud/go-sdk"
23+ "github.com/yandex-cloud/go-sdk/iamkey"
2224)
2325
2426type Driver struct {
@@ -61,7 +63,7 @@ const (
6163 defaultDiskSize = 20
6264 defaultDiskType = "network-hdd"
6365 defaultEndpoint = "api.cloud.yandex.net:443"
64- defaultImageFamily = "ubuntu-1604 -lts"
66+ defaultImageFamily = "ubuntu-2004 -lts"
6567 defaultImageFolderID = StandardImagesFolderID
6668 defaultMemory = 1
6769 defaultPlatformID = "standard-v1"
@@ -245,13 +247,6 @@ func (d *Driver) SetConfigFromFlags(flags drivers.DriverOptions) error {
245247 d .ServiceAccountKeyFile = flags .String ("yandex-sa-key-file" )
246248 d .Token = flags .String ("yandex-token" )
247249
248- switch {
249- case d .Token != "" && d .ServiceAccountKeyFile != "" :
250- return fmt .Errorf ("Yandex.Cloud driver requires one of token or service account key file, not both" )
251- case d .Token == "" && d .ServiceAccountKeyFile == "" :
252- return fmt .Errorf ("A token or service account key file must be specified" )
253- }
254-
255250 d .Cores = flags .Int ("yandex-cores" )
256251 d .CoreFraction = flags .Int ("yandex-core-fraction" )
257252 d .DiskSize = flags .Int ("yandex-disk-size" )
@@ -345,7 +340,7 @@ func (d *Driver) Create() error {
345340 return err
346341 }
347342
348- publicKey , err := ioutil .ReadFile (d .publicSSHKeyPath ())
343+ publicKey , err := os .ReadFile (d .publicSSHKeyPath ())
349344 if err != nil {
350345 return err
351346 }
@@ -610,7 +605,7 @@ func (d *Driver) prepareUserData(publicKey string) (string, error) {
610605
611606 if d .UserDataFile != "" {
612607 log .Infof ("Use provided file %q with user-data" , d .UserDataFile )
613- buf , err := ioutil .ReadFile (d .UserDataFile )
608+ buf , err := os .ReadFile (d .UserDataFile )
614609 if err != nil {
615610 return "" , err
616611 }
@@ -623,6 +618,45 @@ func (d *Driver) prepareUserData(publicKey string) (string, error) {
623618 return userData , nil
624619}
625620
621+ func (d * Driver ) Credentials () (ycsdk.Credentials , error ) {
622+ if d .ServiceAccountKeyFile != "" && d .Token != "" {
623+ return nil , fmt .Errorf ("only one of 'token' or 'sa-key-file' should be specified" )
624+ }
625+
626+ if d .ServiceAccountKeyFile != "" {
627+ key , err := iamkey .ReadFromJSONFile (d .ServiceAccountKeyFile )
628+ if err != nil {
629+ return nil , err
630+ }
631+ return ycsdk .ServiceAccountKey (key )
632+ }
633+
634+ if d .Token != "" {
635+ if strings .HasPrefix (d .Token , "t1." ) && strings .Count (d .Token , "." ) == 2 {
636+ return ycsdk .NewIAMTokenCredentials (d .Token ), nil
637+ }
638+ return ycsdk .OAuthToken (d .Token ), nil
639+ }
640+
641+ if sa := ycsdk .InstanceServiceAccount (); checkServiceAccountAvailable (context .Background (), sa ) {
642+ fmt .Println ("Trying to get Instance Service Account." )
643+ return sa , nil
644+ }
645+
646+ return nil , fmt .Errorf ("one of 'token' or 'sa-key-file' should be specified; if you are inside compute instance, you can attach service account to it in order to authenticate via instance service account" )
647+ }
648+
649+ func checkServiceAccountAvailable (ctx context.Context , sa ycsdk.NonExchangeableCredentials ) bool {
650+ dialer := net.Dialer {Timeout : 50 * time .Millisecond }
651+ conn , err := dialer .Dial ("tcp" , net .JoinHostPort (ycsdk .InstanceMetadataAddr , "80" ))
652+ if err != nil {
653+ return false
654+ }
655+ _ = conn .Close ()
656+ _ , err = sa .IAMToken (ctx )
657+ return err == nil
658+ }
659+
626660func defaultUserData (sshUserName , sshPublicKey string ) (string , error ) {
627661 type templateData struct {
628662 SSHUserName string
0 commit comments