@@ -16,6 +16,7 @@ import (
1616 "golang.org/x/oauth2"
1717
1818 "github.com/docker/go-plugins-helpers/volume"
19+ metadata "github.com/linode/go-metadata"
1920 "github.com/linode/linodego"
2021 log "github.com/sirupsen/logrus"
2122)
@@ -84,10 +85,30 @@ func setupLinodeAPI(token string) *linodego.Client {
8485 return & api
8586}
8687
88+ func metadataServicesAvailable () bool {
89+ conn , err := net .DialTimeout ("tcp" , fmt .Sprintf ("%s:80" , metadata .APIHost ), 2 * time .Second )
90+ if err != nil {
91+ return false
92+ }
93+
94+ conn .Close ()
95+ return true
96+ }
97+
8798func (driver * linodeVolumeDriver ) determineLinodeID () error {
99+ if metadataServicesAvailable () {
100+ err := driver .determineLinodeIDFromMetadata ()
101+ if err != nil {
102+ log .Error (
103+ "Failed to get linode info from Linode metadata service. " +
104+ "Other methods will be used." ,
105+ )
106+ }
107+ }
108+
88109 if driver .linodeLabel == "" {
89110 // If the label isn't defined, we should determine the IP through the network interface
90- log .Infof ("Using network interface to determine Linode ID" )
111+ log .Info ("Using network interface to determine Linode ID" )
91112
92113 if err := driver .determineLinodeIDFromNetworking (); err != nil {
93114 return fmt .Errorf ("Failed to determine Linode ID from networking: %s\n " +
@@ -98,6 +119,28 @@ func (driver *linodeVolumeDriver) determineLinodeID() error {
98119 return nil
99120 }
100121
122+ return driver .determineLinodeIDFromLabel ()
123+ }
124+
125+ func (driver * linodeVolumeDriver ) determineLinodeIDFromMetadata () error {
126+ client , err := metadata .NewClient (context .Background ())
127+ if err != nil {
128+ return err
129+ }
130+
131+ instanceInfo , err := client .GetInstance (context .Background ())
132+ if err != nil {
133+ return err
134+ }
135+
136+ driver .instanceID = instanceInfo .ID
137+ driver .region = instanceInfo .Region
138+ driver .linodeLabel = instanceInfo .Label
139+
140+ return nil
141+ }
142+
143+ func (driver * linodeVolumeDriver ) determineLinodeIDFromLabel () error {
101144 jsonFilter , _ := json .Marshal (map [string ]string {"label" : driver .linodeLabel })
102145 listOpts := linodego .NewListOptions (0 , string (jsonFilter ))
103146 linodes , lErr := driver .linodeAPIPtr .ListInstances (context .Background (), listOpts )
@@ -292,7 +335,6 @@ func (driver *linodeVolumeDriver) Create(req *volume.CreateRequest) error {
292335
293336// Remove implementation
294337func (driver * linodeVolumeDriver ) Remove (req * volume.RemoveRequest ) error {
295-
296338 driver .mutex .Lock ()
297339 defer driver .mutex .Unlock ()
298340
@@ -374,7 +416,7 @@ func (driver *linodeVolumeDriver) Mount(req *volume.MountRequest) (*volume.Mount
374416 mp := driver .labelToMountPoint (linVol .Label )
375417 if _ , err := os .Stat (mp ); os .IsNotExist (err ) {
376418 log .Infof ("Creating mountpoint directory: %s" , mp )
377- if err = os .MkdirAll (mp , 0755 ); err != nil {
419+ if err = os .MkdirAll (mp , 0o755 ); err != nil {
378420 return nil , fmt .Errorf ("Error creating mountpoint directory(%s): %s" , mp , err )
379421 }
380422 }
@@ -556,7 +598,6 @@ func waitForVolumeNotBusy(api *linodego.Client, volumeID int) error {
556598 filter .Order = "desc"
557599
558600 detachFilterStr , err := filter .MarshalJSON ()
559-
560601 if err != nil {
561602 return err
562603 }
0 commit comments