使用 Go

IBM® Storage Ceph® as a Service SDK for Go 提供可充分利用 IBM Storage Ceph as a Service 的特性。

IBM Storage Ceph as a Service SDK for GO 的功能非常全面,有很多特性和功能超出了本指南的範圍和篇幅。 如需詳細的類別和方法說明文件,請參閱 GO API 文件中的 Block StorageObject Storage. 原始碼可在 GitHub 套件庫中找到。

取得 SDK

使用 go get 擷取 SDK,並將其新增至您的 GOPATH 工作區,或專案的 GO 模組相依性。 SDK 要求最低版本為 GO 1.21 或以上。 當我們的品質控制處理程序完成後,未來的 Go 版本將受到支援。 如需詳細資訊,請參閱 GO API 文件中的 Block StorageObject Storage.

go get github.com/IBM/sds-go-sdk/v2/sdsaasv2

若要更新 SDK,請使用 go get -u 擷取最新版本的 SDK。

go get -u github.com/IBM/sds-go-sdk/v2/sdsaasv2

範例中提到的 SDK Go github 連結僅在 General Availability (GA) 之後才會生效。

匯入套件

安裝 SDK 後,匯入 GO 應用程式使用 SDK 所需的套件,如以下範例所示。

import (
	"github.com/IBM/sds-go-sdk/v2/sdsaasv2"
)

開始使用程式碼範例之前

以下項目是建立或修改磁碟區或主機詳細資訊的必要項目:

  • IBM Storage Ceph as a Service 部署實例
  • 與部署相關的服務端點
  • API 金鑰

程式碼範例

設定

var (
	sdsaasService *sdsaasv2.SdsaasV2
)

func main() {

	authenticator := &core.IamAuthenticator{
		ApiKey: <apiKey>,
	}

	sdsaasServiceOptions := &sdsaasv2.SdsaasV2Options{
		URL:           <serviceEndpoint>,
		Authenticator: authenticator,
	}

	sdsaasService, err := sdsaasv2.NewSdsaasV2(sdsaasServiceOptions)
	if err != nil {
		panic(err)
	}
}

建立新卷冊

	createVolumeOptions := sdsaasService.NewCreateVolumeOptions(
		int64(5),
	)
	createVolumeOptions.SetName("my-volume")

	volumeSummary, response, err := sdsaasService.CreateVolume(createVolumeOptions)
	if err != nil {
		panic(err)
	}

列出可用的卷冊

	listVolumesOptions := sdsaasService.NewListVolumesOptions()
	listVolumesOptions.SetLimit(int64(10))

	volumeCollection, response, err := sdsaasService.ListVolumes(listVolumesOptions)
	if err != nil {
		panic(err)
	}

	fmt.Println("Printing out a collection of volumes")
	for _, volume := range volumeCollection.Volumes {
		fmt.Println("Volume: ", *volume.Name, "    Volume ID: ", *volume.ID)
	}

更新卷冊

	volumePatch := map[string]interface{}{
		"name": "my-volume-updated",
	}

	updateVolumeOptions := sdsaasService.NewUpdateVolumeOptions(
		*volume.ID,
	)

	volume, response, err := sdsaasService.UpdateVolume(updateVolumeOptions)
	if err != nil {
		panic(err)
	}

取得容量詳細資料

	volumeOptions := sdsaasService.NewGetVolumeOptions(
		*volumeSummary.ID,
	)

	volume, response, err := sdsaasService.GetVolume(volumeOptions)
	if err != nil {
		panic(err)
	}

	fmt.Println("Printing out volume ", *volume.Name)
	fmt.Println("Volume: ", *volume.Name, "    Volume ID: ", *volume.ID)

刪除磁區

	volumeDeleteOptions := sdsaasService.NewDeleteVolumeOptions(
		*volume.ID,
	)
	response, err = sdsaasService.DeleteVolume(volumeDeleteOptions)
	if err != nil {
		panic(err)
	}

建立磁區 Snapshot

	sourceVolumeModel := &sdsaasv2.SourceVolume{
		ID: core.StringPtr(*volume.ID),
	}

	volumeSnapshotCreateOptions := sdsaasService.NewCreateSnapshotOptions(
		sourceVolumeModel,
	)

	snapshot, response, err := sdsaasService.CreateSnapshot(volumeSnapshotCreateOptions)
	if err != nil {
		panic(err)
	}

列出所有磁碟區快照

	listSnapshotsOptions := sdsaasService.NewListSnapshotsOptions()

	pager, err := sdsaasService.NewSnapshotsPager(listSnapshotsOptions)
	if err != nil {
		panic(err)
	}

	var allResults []sdsaasv2.Snapshot
	for pager.HasNext() {
		nextPage, err := pager.GetNext()
		if err != nil {
			panic(err)
		}
		allResults = append(allResults, nextPage...)
	}
	b, _ := json.MarshalIndent(allResults, "", "  ")
	fmt.Println(string(b))

更新磁碟區快照

	snapshotPatchModel := &sdsaasv2.SnapshotPatch{
		Name: core.StringPtr("my-snapshot-updated"),
	}
	snapshotPatchModelAsPatch, asPatchErr := snapshotPatchModel.AsPatch()
	if asPatchErr != nil {
		panic(asPatchErr)
	}

	updateSnapshotOptions := sdsaasService.NewUpdateSnapshotOptions(
		*snapshot.ID,
		snapshotPatchModelAsPatch,
	)

	snapshot, response, err := sdsaasService.UpdateSnapshot(updateSnapshotOptions)
	if err != nil {
		panic(err)
	}

列出磁碟區快照

	getSnapshotOptions := sdsaasService.NewGetSnapshotOptions(
		*snapshot.ID,
	)

	snapshot, _, err = sdsaasService.GetSnapshot(getSnapshotOptions)
	if err != nil {
		panic(err)
	}

從快照還原磁碟區

	volumeCreateOptions := sdsaasService.NewCreateVolumeOptions(
		int64(10),
	)
	volumeCreateOptions.SetName("volume-restored-from-snapshot")

	sourceSnapshot, err := sdsaasService.NewSourceSnapshot(*snapshot.ID)
	if err != nil {
		panic(err)
	}
	volumeCreateOptions.SetSourceSnapshot(sourceSnapshot)

	volumeSummary, response, err := sdsaasService.CreateVolume(volumeCreateOptions)
	if err != nil {
		panic(err)
	}

刪除磁碟區快照

	deleteSnapshotOptions := sdsaasService.NewDeleteSnapshotOptions(
		*snapshot.ID,
	)

	response, err := sdsaasService.DeleteSnapshot(deleteSnapshotOptions)
	if err != nil {
		panic(err)
	}

建立主機

	createHostOptions := sdsaasService.NewCreateHostOptions(
		<hostNQN>,
	)

	createHostOptions.SetName("my-host")

	hostSummary, response, err := sdsaasService.CreateHost(createHostOptions)
	if err != nil {
		panic(err)
	}

清單主機

	hostsOptions := sdsaasService.NewListHostsOptions()
	hostsOptions.SetLimit(int64(10))

	hostCollection, response, err := sdsaasService.ListHosts(hostsOptions)
	if err != nil {
		panic(err)
	}

	fmt.Println("Printing out a collection of hosts")
	for _, host := range hostCollection.Hosts {
		fmt.Println("Host: ", *host.Name, "    Host ID: ", *host.ID)
	}

更新主機

	hostPatch := map[string]interface{}{
		"name": "my-host-updated",
	}

	updateHostOptions := sdsaasService.NewUpdateHostOptions(
		*hostSummary.ID,
		hostPatch,
	)

	host, response, err := sdsaasService.UpdateHost(updateHostOptions)
	if err != nil {
		panic(err)
	}

取得主機

	hostOptions := sdsaasService.NewGetHostOptions(
		*host.ID,
	)

	host, response, err := sdsaasService.GetHost(hostOptions)
	if err != nil {
		panic(err)
	}

	fmt.Println("Printing out host ", *host.Name)
	fmt.Println("Host: ", *volume.Name, "    Host ID: ", *host.ID)

將主機對應到磁碟區

	volumeIdentityModel := &sdsaasv2.VolumeIdentity{
		ID: volume.ID,
	}

	createVolumeMappingOptions := sdsaasService.NewCreateVolumeMappingOptions(
		*host.ID,
		volumeIdentityModel,
	)

	volumeMappingReference, response, err := sdsaasService.CreateVolumeMapping(createVolumeMappingOptions)
	if err != nil {
		panic(err)
	}

	fmt.Println("Host mapping created")
	fmt.Println("Volume ID: ", *volumeMapping.Volume.ID)
	fmt.Println("Host ID: ", *volumeMapping.Host.ID)
	fmt.Println("Volume mapping ID: ", *volumeMapping.ID)

檢視所有主機對應

	volumeMappingOptions := sdsaasService.NewListVolumeMappingsOptions(
		*host.ID,
	)
	volumeMappingCollection, response, err := sdsaasService.ListVolumeMappings(volumeMappingOptions)
	if err != nil {
		panic(err)
	}

	fmt.Println("Printing out a collection of host mappings")
	for _, mapping := range volumeMappingCollection.VolumeMappings {
		fmt.Println("Host ID: ", *mapping.Host.ID)
		fmt.Println("Volume ID: ", *mapping.Volume.ID)
		fmt.Println("Volume mapping ID: ", *mapping.ID)
		fmt.Println()
	}

檢視特定主機對應

	getVolumeMappingOptions := sdsaasService.NewGetVolumeMappingOptions(
		*host.ID,
		<VOLUME-MAPPING-ID>,
	)

	volumeMapping, response, err := sdsaasService.HostMapping(getVolumeMappingOptions)
	if err != nil {
		panic(err)
	}

	fmt.Println("Host mapping")
	fmt.Println("Volume ID: ", *volumeMapping.Volume.ID)
	fmt.Println("Host ID: ", *volumeMapping.Host.ID)
	fmt.Println("Volume mapping ID: ", *volumeMapping.ID)

從磁碟區解除對應主機

	hostMappingDeleteOptions := sdsaasService.NewHostMappingDeleteOptions(
		*host.ID,
		<VOLUME-MAPPING-ID>,
	)

	response, err := sdsaasService.HostMappingDelete(hostMappingDeleteOptions)
	if err != nil {
		panic(err)
	}

從主機解除所有映射

	hostMappingDeleteAllOptions := sdsaasService.NewHostMappingDeleteAllOptions(
		*host.ID,
	)

	_, err = sdsaasService.HostMappingDeleteAll(hostMappingDeleteAllOptions)
	if err != nil {
		panic(err)
	}

刪除主機

	hostDeleteOptions := sdsaasService.NewDeleteHostOptions(
		*host.ID,
	)
	_, err = sdsaasService.DeleteHost(hostDeleteOptions)
	if err != nil {
		panic(err)
	}

分享建立

	createShareOptions := sdsaasService.NewCreateShareOptions(
		int64(10),
	)

	share, response, err := sdsaasService.CreateShare(createShareOptions)
	if err != nil {
		panic(err)
	}

股票清單

	listSharesOptions := &sdsaasv2.ListSharesOptions{
		Limit: core.Int64Ptr(int64(20)),
	}

	pager, err := sdsaasService.NewSharesPager(listSharesOptions)
	if err != nil {
		panic(err)
	}

分享清單

	getShareOptions := sdsaasService.NewGetShareOptions(
		*share.ID,
	)

	share, response, err := sdsaasService.GetShare(getShareOptions)
	if err != nil {
		panic(err)
	}

分享更新

	sharePatchModel := &sdsaasv2.SharePatch{
		Name: core.StringPtr("my-share")
	}
	sharePatchModelAsPatch, asPatchErr := sharePatchModel.AsPatch()

	updateShareOptions := sdsaasService.NewUpdateShareOptions(
		*share.ID,
		sharePatchModelAsPatch,
	)

	share, response, err := sdsaasService.UpdateShare(updateShareOptions)
	if err != nil {
		panic(err)
	}

分享刪除

	deleteShareOptions := &sdsaasv2.DeleteShareOptions{
		ShareID:     *share.ID,
		ForceDelete: core.BoolPtr(false),
	}

	response, err := sdsaasService.DeleteShare(deleteShareOptions)

建立掛載目標

	cidrClientTypeModel := &sdsaasv2.CIDRClientType{
		CIDR: []string{"192.168.3.0/24"},
	}

	createMountTargetOptions := sdsaasService.NewCreateMountTargetOptions(
		*share.ID,
		"mountTargetName",
		cidrClientTypeModel,
	)

	mountTarget, response, err := sdsaasService.CreateMountTarget(createMountTargetOptions)
	if err != nil {
		panic(err)
	}

掛載目標清單

	listMountTargetsOptions := &sdsaasv2.ListMountTargetsOptions{
		ShareID: *share.ID,
	}

	listMountTargetsOptions.Start = nil
	listMountTargetsOptions.Limit = core.Int64Ptr(1)

	var allResults []sdsaasv2.MountTarget
	for {
		mountTargetCollection, response, err := sdsaasService.ListMountTargets(listMountTargetsOptions)
		Expect(err).To(BeNil())
		Expect(response.StatusCode).To(Equal(200))
		Expect(mountTargetCollection).ToNot(BeNil())
		allResults = append(allResults, mountTargetCollection.MountTargets...)

		listMountTargetsOptions.Start, err = mountTargetCollection.GetNextStart()
		Expect(err).To(BeNil())

		if listMountTargetsOptions.Start == nil {
			break
		}
	}

	fmt.Println("All mount-targest: ", allResults)

掛載目標清單

	getMountTargetOptions := &sdsaasv2.GetMountTargetOptions{
		ShareID: *share.ID,
		MountID: *mount.ID,
	}

	mountTarget, response, err := sdsaasService.GetMountTarget(getMountTargetOptions)

安裝目標更新

	cidrClientTypeModel := &sdsaasv2.CIDRClientType{
		CIDR: []string{"192.168.3.0/24"},
	}

	mountTargetPatchModel := &sdsaasv2.MountTargetPatch{
		Name:    core.StringPtr("mountTargetNameUpdated"),
		Clients: cidrClientTypeModel,
	}

	mountTargetPatchModelAsPatch, asPatchErr := mountTargetPatchModel.AsPatch()

	updateMountTargetOptions := &sdsaasv2.UpdateMountTargetOptions{
		ShareID: *share.ID,
		MountID: *mountTarget.ID,
		MountTargetPatch: mountTargetPatchModelAsPatch,
	}

	mountTarget, response, err := sdsaasService.UpdateMountTarget(updateMountTargetOptions)

刪除掛載目標

	deleteMountTargetOptions := &sdsaasv2.DeleteMountTargetOptions{
		ShareID: *share.ID,
		MountID: *mountTarget.ID,
	}

	response, err := sdsaasService.DeleteMountTarget(deleteMountTargetOptions)

建立卷組

	volume1Model := &sdsaasv2.Volume1{
		ID: *volume.ID,
	}

	createVolumeGroupOptions := &sdsaasv2.CreateVolumeGroupOptions{
		Name:    core.StringPtr("my-volume-group"),
		Volumes: []sdsaasv2.Volume1{*volume1Model},
	}

	volumeGroup, response, err := sdsaasService.CreateVolumeGroup(createVolumeGroupOptions)

卷組清單

	listVolumeGroupsOptions := &sdsaasv2.ListVolumeGroupsOptions{
		Start: *volumeGroup.ID,
	}

	listVolumeGroupsOptions.Start = nil
	listVolumeGroupsOptions.Limit = core.Int64Ptr(1)

	var allResults []sdsaasv2.VolumeGroup
	for {
		volumeGroupCollection, response, err := sdsaasService.ListVolumeGroups(listVolumeGroupsOptions)

		allResults = append(allResults, volumeGroupCollection.VolumeGroups...)

		listVolumeGroupsOptions.Start, err = volumeGroupCollection.GetNextStart()

		if listVolumeGroupsOptions.Start == nil {
			break
		}
	}

	fmt.Println("All volumeGroups: ", allResults)

卷組清單

	getVolumeGroupOptions := &sdsaasv2.GetVolumeGroupOptions{
		VolumeGroupID: *volumeGroup.ID,
	}

	volumeGroup, response, err := sdsaasService.GetVolumeGroup(getVolumeGroupOptions)

卷組更新

	volumeGroupPatchModel := &sdsaasv2.VolumeGroupPatch{
		Name: core.StringPtr("my-volume-group"),
	}
	volumeGroupPatchModelAsPatch, asPatchErr := volumeGroupPatchModel.AsPatch()

	updateVolumeGroupOptions := &sdsaasv2.UpdateVolumeGroupOptions{
		VolumeGroupID:    *volumeGroup.ID,
		VolumeGroupPatch: volumeGroupPatchModelAsPatch,
	}

	volumeGroup, response, err := sdsaasService.UpdateVolumeGroup(updateVolumeGroupOptions)

音量群組新增音量

	createVolumeInVolumeGroupOptions := &sdsaasv2.CreateVolumeInVolumeGroupOptions{
		VolumeGroupID: *volumeGroup.ID,
		VolumeID:      *volume.ID,
	}

	volumeGroup, response, err := sdsaasService.CreateVolumeInVolumeGroup(createVolumeInVolumeGroupOptions)

磁碟區群組刪除磁碟區

	deleteVolumeFromVolumeGroupOptions := &sdsaasv2.DeleteVolumeFromVolumeGroupOptions{
		VolumeGroupID: *volumeGroup.ID,
		VolumeID:      *volume.ID,
	}

	response, err := sdsaasService.DeleteVolumeFromVolumeGroup(deleteVolumeFromVolumeGroupOptions)

刪除卷組

	deleteVolumeGroupOptions := &sdsaasv2.DeleteVolumeGroupOptions{
		VolumeGroupID: volumeGroup.ID,
	}

	response, err := sdsaasService.DeleteVolumeGroup(deleteVolumeGroupOptions)

建立憑證

	createHmacCredentialsOptions := sdsaasService.NewCreateHmacCredentialsOptions(
		"test-key",
	)

	accessKeyResponse, response, err := sdsaasService.CreateHmacCredentials(createHmacCredentialsOptions)
	if err != nil {
		panic(err)
	}

證書清單

	listHmacCredentialsOptions := sdsaasService.NewListHmacCredentialsOptions()

	storageCredResponse, response, err := sdsaasService.ListHmacCredentials(listHmacCredentialsOptions)
	if err != nil {
		panic(err)
	}

憑證刪除

	deleteHmacCredentialsOptions := sdsaasService.NewDeleteHmacCredentialsOptions(
		"test-key",
	)

	response, err := sdsaasService.DeleteHmacCredentials(deleteHmacCredentialsOptions)
	if err != nil {
		panic(err)
	}

證書清單

	listCertificatesOptions := sdsaasService.NewListCertificatesOptions()

	certListResponse, response, err := sdsaasService.ListCertificates(listCertificatesOptions)
	if err != nil {
		panic(err)
	}

建立證書

	createSslCertOptions := sdsaasService.NewCreateSslCertOptions(
		"s3",
	)

	certResponse, response, err := sdsaasService.CreateSslCert(createSslCertOptions)
	if err != nil {
		panic(err)
	}

證書清單

	getS3SslCertStatusOptions := sdsaasService.NewGetS3SslCertStatusOptions(
		"s3",
	)

	statusResponse, response, err := sdsaasService.GetS3SslCertStatus(getS3SslCertStatusOptions)
	if err != nil {
		panic(err)
	}

憑證更新/更換

	replaceSslCertOptions := sdsaasService.NewReplaceSslCertOptions(
		"s3",
	)

	certResponse, response, err := sdsaasService.ReplaceSslCert(replaceSslCertOptions)
	if err != nil {
		panic(err)
	}

憑證刪除

	deleteSslCertOptions := sdsaasService.NewDeleteSslCertOptions(
		"s3",
	)

	response, err := sdsaasService.DeleteSslCert(deleteSslCertOptions)
	if err != nil {
		panic(err)
	}

後續步驟

如果您還沒有參閱詳細的類別和方法說明文件,請參閱 GO API 文件中的 Block StorageObject Storage.