@@ -84,48 +84,57 @@ func (VolAPIImplementor) DismountVolume(volumeID, path string) error {
8484func (VolAPIImplementor ) ResizeVolume (volumeID string , size int64 ) error {
8585 // TODO: Check the size of the resize
8686 // TODO: We have to get the right partition.
87- cmd := fmt .Sprintf ("Get-Volume -UniqueId \" %s\" | Get-partition | Resize-Partition -Size %d" , volumeID , size )
87+ cmd := fmt .Sprintf ("Get-Volume -UniqueId \" %s\" | Get-partition | Get-PartitionSupportedSize | Select SizeMin,SizeMax | ConvertTo-Json" , volumeID )
8888 out , err := runExec (cmd )
89+
90+ if err != nil || len (out ) == 0 {
91+ return fmt .Errorf ("error getting sizemin,sizemax from mount. cmd: %s, output: %s, error: %v" , cmd , string (out ), err )
92+ }
93+
94+ var getVolumeSizing map [string ]int64
95+ outString := string (out )
96+ err = json .Unmarshal ([]byte (outString ), & getVolumeSizing )
8997 if err != nil {
90- return fmt .Errorf ("error resizing volume. cmd: %s, output: %s, error: %v" , cmd , string ( out ) , err )
98+ return fmt .Errorf ("out %v outstring %v err %v" , out , outString , err )
9199 }
92- return nil
93- }
94100
95- // VolumeStats - resize the volume to the size specified as parameter.
96- func ( VolAPIImplementor ) VolumeStats ( volumeID string ) ( int64 , int64 , int64 , error ) {
101+ sizeMin := getVolumeSizing [ "SizeMin" ]
102+ sizeMax := getVolumeSizing [ "SizeMax" ]
97103
98- //first get the disk size where the volume resides
99- cmd := fmt .Sprintf ("(Get-Volume -UniqueId \" %s\" | Get-partition | Get-Disk).Size" , volumeID )
100- out , err := runExec (cmd )
101- if err != nil || len (out ) == 0 {
102- return - 1 , - 1 , - 1 , fmt .Errorf ("error getting size of disk. cmd: %s, output: %s, error: %v" , cmd , string (out ), err )
104+ //if the size is too small then fail here
105+ if size < sizeMin {
106+ return fmt .Errorf ("size %v is below the minimum %v allowed for the volume" , size , sizeMin )
103107 }
104108
105- reg , err := regexp .Compile ("[^0-9]+" )
106- if err != nil {
107- return - 1 , - 1 , - 1 , fmt .Errorf ("error compiling regex. err: %v" , err )
109+ //if the size is greater than sizeMax but within 10% it might be due to overhead, change size to sizeMax
110+ //otherwise let size go through, it will fail the resize operation
111+ if (size > sizeMax ) && (float64 (size ) < float64 (float64 (sizeMax )* float64 (1.1 ))) {
112+ size = sizeMax
108113 }
109- diskSizeOutput := reg .ReplaceAllString (string (out ), "" )
110114
111- diskSize , err := strconv .ParseInt (diskSizeOutput , 10 , 64 )
115+ cmd = fmt .Sprintf ("Get-Volume -UniqueId \" %s\" | Get-partition | Resize-Partition -Size %d" , volumeID , size )
116+ out , err = runExec (cmd )
112117 if err != nil {
113- return - 1 , - 1 , - 1 , fmt .Errorf ("error parsing size of disk . cmd: %s, output: %s, error: %v" , cmd , diskSizeOutput , err )
118+ return fmt .Errorf ("error resizing volume . cmd: %s, output: %s size:%v, sizeMax %v, error: %v" , cmd , string ( out ), size , sizeMax , err )
114119 }
120+ return nil
121+ }
115122
116- // secondly, get the size and sizeRemaining for the volume
117- cmd = fmt .Sprintf ("(Get-Volume -UniqueId \" %s\" | Select SizeRemaining,Size) | ConvertTo-Json" , volumeID )
118- out , err = runExec (cmd )
123+ // VolumeStats - resize the volume to the size specified as parameter.
124+ func (VolAPIImplementor ) VolumeStats (volumeID string ) (int64 , int64 , error ) {
125+ // get the size and sizeRemaining for the volume
126+ cmd := fmt .Sprintf ("(Get-Volume -UniqueId \" %s\" | Select SizeRemaining,Size) | ConvertTo-Json" , volumeID )
127+ out , err := runExec (cmd )
119128
120129 if err != nil {
121- return - 1 , - 1 , - 1 , fmt .Errorf ("error getting capacity and used size of volume. cmd: %s, output: %s, error: %v" , cmd , string (out ), err )
130+ return - 1 , - 1 , fmt .Errorf ("error getting capacity and used size of volume. cmd: %s, output: %s, error: %v" , cmd , string (out ), err )
122131 }
123132
124133 var getVolume map [string ]int64
125134 outString := string (out )
126135 err = json .Unmarshal ([]byte (outString ), & getVolume )
127136 if err != nil {
128- return - 1 , - 1 , - 1 , fmt .Errorf ("out %v outstring %v err %v" , out , outString , err )
137+ return - 1 , - 1 , fmt .Errorf ("out %v outstring %v err %v" , out , outString , err )
129138 }
130139 var volumeSizeRemaining int64
131140 var volumeSize int64
@@ -134,5 +143,61 @@ func (VolAPIImplementor) VolumeStats(volumeID string) (int64, int64, int64, erro
134143 volumeSizeRemaining = getVolume ["SizeRemaining" ]
135144
136145 volumeUsedSize := volumeSize - volumeSizeRemaining
137- return diskSize , volumeSize , volumeUsedSize , nil
146+ return volumeSizeRemaining , volumeUsedSize , nil
147+ }
148+
149+ // GetVolumeDiskNumber - gets the disk number where the volume is.
150+ func (VolAPIImplementor ) GetVolumeDiskNumber (volumeID string ) (int64 , error ) {
151+ // get the size and sizeRemaining for the volume
152+ cmd := fmt .Sprintf ("(Get-Volume -UniqueId \" %s\" | Get-Partition).DiskNumber" , volumeID )
153+ out , err := runExec (cmd )
154+
155+ if err != nil || len (out ) == 0 {
156+ return - 1 , fmt .Errorf ("error getting disk number. cmd: %s, output: %s, error: %v" , cmd , string (out ), err )
157+ }
158+
159+ reg , err := regexp .Compile ("[^0-9]+" )
160+ if err != nil {
161+ return - 1 , fmt .Errorf ("error compiling regex. err: %v" , err )
162+ }
163+ diskNumberOutput := reg .ReplaceAllString (string (out ), "" )
164+
165+ diskNumber , err := strconv .ParseInt (diskNumberOutput , 10 , 64 )
166+
167+ if err != nil {
168+ return - 1 , fmt .Errorf ("error parsing disk number. cmd: %s, output: %s, error: %v" , cmd , diskNumberOutput , err )
169+ }
170+
171+ return diskNumber , nil
172+ }
173+
174+ // GetVolumeIDFromMount - gets the volume ID given a mount point
175+ func (VolAPIImplementor ) GetVolumeIDFromMount (mount string ) (string , error ) {
176+ // get the size and sizeRemaining for the volume
177+ cmd := fmt .Sprintf ("Get-Item -LiteralPath \" %s\" | Select Target | ConvertTo-Json" , mount )
178+ out , err := runExec (cmd )
179+
180+ if err != nil || len (out ) == 0 {
181+ return "" , fmt .Errorf ("error getting volume from mount. cmd: %s, output: %s, error: %v" , cmd , string (out ), err )
182+ }
183+
184+ var getVolume map [string ][]string
185+ outString := string (out )
186+ err = json .Unmarshal ([]byte (outString ), & getVolume )
187+ if err != nil {
188+ return "" , fmt .Errorf ("out %v outstring %v err %v" , out , outString , err )
189+ }
190+ var volumeString string
191+
192+ volumeString = getVolume ["Target" ][0 ]
193+
194+ volumeString = strings .TrimSuffix (volumeString , "\n " )
195+
196+ if ! strings .HasPrefix (volumeString , "Volume" ) {
197+ return "" , fmt .Errorf ("error getting the volume for the mount %s, received (%s), extracted %s" , mount , outString , volumeString )
198+ }
199+
200+ volumeString = "\\ \\ ?\\ " + volumeString
201+
202+ return volumeString , nil
138203}
0 commit comments