func (d *driver) VolumeRemove( ctx types.Context, volumeID string, opts types.Store) error { fields := eff(map[string]interface{}{ "volumeId": volumeID, }) var err error var volumes []*siotypes.Volume if volumes, err = d.getVolume(volumeID, "", 0); err != nil { return goof.WithFieldsE(fields, "error getting volume", err) } targetVolume := sio.NewVolume(d.client) targetVolume.Volume = volumes[0] if err = targetVolume.RemoveVolume("ONLY_ME"); err != nil { return goof.WithFieldsE(fields, "error removing volume", err) } log.WithFields(fields).Debug("removed volume") return nil }
func (d *driver) VolumeAttach( ctx types.Context, volumeID string, opts *types.VolumeAttachOpts) (*types.Volume, string, error) { iid := context.MustInstanceID(ctx) mapVolumeSdcParam := &siotypes.MapVolumeSdcParam{ SdcID: iid.ID, AllowMultipleMappings: "false", AllSdcs: "", } vol, err := d.VolumeInspect( ctx, volumeID, &types.VolumeInspectOpts{ Attachments: types.VolAttReqTrue, }) if err != nil { return nil, "", goof.WithError("error getting volume", err) } if len(vol.Attachments) > 0 && !opts.Force { return nil, "", goof.New("volume already attached to a host") } if len(vol.Attachments) > 0 && opts.Force { if _, err := d.VolumeDetach(ctx, volumeID, &types.VolumeDetachOpts{Force: opts.Force}); err != nil { return nil, "", err } } targetVolume := sio.NewVolume(d.client) targetVolume.Volume = &siotypes.Volume{ID: vol.ID} err = targetVolume.MapVolumeSdc(mapVolumeSdcParam) if err != nil { return nil, "", goof.WithError("error mapping volume sdc", err) } attachedVol, err := d.VolumeInspect( ctx, volumeID, &types.VolumeInspectOpts{ Attachments: types.VolAttReqTrue, Opts: opts.Opts, }) if err != nil { return nil, "", goof.WithError("error getting volume", err) } return attachedVol, attachedVol.ID, nil }
func (d *driver) VolumeDetach( ctx types.Context, volumeID string, opts *types.VolumeDetachOpts) (*types.Volume, error) { iid := context.MustInstanceID(ctx) volumes, err := d.getVolume(volumeID, "", 0) if err != nil { return nil, goof.WithError("error getting volume", err) } if len(volumes) == 0 { return nil, goof.New("no volumes returned") } targetVolume := sio.NewVolume(d.client) targetVolume.Volume = volumes[0] unmapVolumeSdcParam := &siotypes.UnmapVolumeSdcParam{ SdcID: "", IgnoreScsiInitiators: "true", AllSdcs: "", } if opts.Force { unmapVolumeSdcParam.AllSdcs = "true" } else { unmapVolumeSdcParam.SdcID = iid.ID } if err := targetVolume.UnmapVolumeSdc(unmapVolumeSdcParam); err != nil { return nil, err } vol, err := d.VolumeInspect(ctx, volumeID, &types.VolumeInspectOpts{ Attachments: types.VolAttReqTrue, }) if err != nil { return nil, err } return vol, nil }