github.com/opentelekomcloud/gophertelekomcloud@v0.9.3/acceptance/openstack/dis/v2/dis_test.go (about)

     1  package v2
     2  
     3  import (
     4  	"log"
     5  	"strings"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/opentelekomcloud/gophertelekomcloud/acceptance/clients"
    10  	"github.com/opentelekomcloud/gophertelekomcloud/acceptance/tools"
    11  	"github.com/opentelekomcloud/gophertelekomcloud/openstack/common/pointerto"
    12  	"github.com/opentelekomcloud/gophertelekomcloud/openstack/dis/v2/apps"
    13  	"github.com/opentelekomcloud/gophertelekomcloud/openstack/dis/v2/checkpoints"
    14  	"github.com/opentelekomcloud/gophertelekomcloud/openstack/dis/v2/data"
    15  	"github.com/opentelekomcloud/gophertelekomcloud/openstack/dis/v2/dump"
    16  	"github.com/opentelekomcloud/gophertelekomcloud/openstack/dis/v2/monitors"
    17  	"github.com/opentelekomcloud/gophertelekomcloud/openstack/dis/v2/streams"
    18  	"github.com/opentelekomcloud/gophertelekomcloud/openstack/obs"
    19  	th "github.com/opentelekomcloud/gophertelekomcloud/testhelper"
    20  )
    21  
    22  func TestDISWorkflow(t *testing.T) {
    23  	client, err := clients.NewDisV2Client()
    24  	th.AssertNoErr(t, err)
    25  	now := time.Now()
    26  	appName := tools.RandomString("app-create-test-", 3)
    27  	log.Printf("Create DIS App, Name: %s", appName)
    28  	err = apps.CreateApp(client, apps.CreateAppOpts{
    29  		AppName: appName,
    30  	})
    31  	th.AssertNoErr(t, err)
    32  	t.Cleanup(func() {
    33  		log.Printf("Delete DIS App, Name: %s", appName)
    34  		err = apps.DeleteApp(client, appName)
    35  		th.AssertNoErr(t, err)
    36  	})
    37  
    38  	log.Printf("Get DIS App, Name: %s", appName)
    39  	app, err := apps.GetApp(client, appName)
    40  	th.AssertNoErr(t, err)
    41  	th.AssertEquals(t, app.AppName, appName)
    42  
    43  	log.Print("List DIS Apps")
    44  	listApps, err := apps.ListApps(client, apps.ListAppOpts{Limit: pointerto.Int(10)})
    45  	th.AssertNoErr(t, err)
    46  	th.AssertEquals(t, *listApps.TotalNumber, 1)
    47  
    48  	streamName := tools.RandomString("stream-create-test-", 3)
    49  	log.Printf("Create DIS Stream, Name: %s", streamName)
    50  	err = streams.CreateStream(client, streams.CreateStreamOpts{
    51  		StreamName:     streamName,
    52  		PartitionCount: 3,
    53  	})
    54  	th.AssertNoErr(t, err)
    55  	t.Cleanup(func() {
    56  		log.Printf("Delete DIS Stream, Name: %s", streamName)
    57  		err = streams.DeleteStream(client, streamName)
    58  		th.AssertNoErr(t, err)
    59  	})
    60  
    61  	log.Printf("Get DIS App status, Name: %s", appName)
    62  	appStatus, err := apps.GetAppStatus(client, apps.GetAppStatusOpts{
    63  		AppName:        appName,
    64  		StreamName:     streamName,
    65  		CheckpointType: "LAST_READ",
    66  	})
    67  	th.AssertNoErr(t, err)
    68  	th.AssertEquals(t, len(appStatus.PartitionConsumingStates), 3)
    69  
    70  	log.Printf("Get DIS Stream, Name: %s", streamName)
    71  	getStream, err := streams.GetStream(client, streams.GetStreamOpts{
    72  		StreamName: streamName,
    73  	})
    74  	th.AssertNoErr(t, err)
    75  	th.AssertEquals(t, getStream.StreamName, streamName)
    76  
    77  	log.Printf("Update DIS Stream partitions count, Name: %s", streamName)
    78  	err = streams.UpdatePartitionCount(client, streams.UpdatePartitionCountOpts{
    79  		StreamName:           streamName,
    80  		TargetPartitionCount: 4,
    81  	})
    82  	th.AssertNoErr(t, err)
    83  
    84  	// "Bad request with: [PUT https://dis.eu-de.otc.t-systems.com/v2/5045c215010c440d91b2f7dce1f3753b/streams/stream-create-test-jmn],
    85  	// error message: {\"errorCode\":\"DIS.4200\",\"message\":\"Invalid request. [Invalid target_partition_count null.]\"}"
    86  	// https://jira.tsi-dev.otc-service.com/browse/BM-2472
    87  	// err = streams.UpdateStream(client, streams.UpdateStreamOpts{
    88  	// 	StreamName: streamName,
    89  	// 	DataType:   "JSON",
    90  	// })
    91  	// th.AssertNoErr(t, err)
    92  
    93  	// getStreamUpdated, err := streams.GetStream(client, streams.GetStreamOpts{
    94  	// 	StreamName: streamName,
    95  	// })
    96  	// th.AssertNoErr(t, err)
    97  	// th.AssertEquals(t, getStreamUpdated.StreamName, streamName)
    98  	// th.AssertEquals(t, getStreamUpdated.DataType, "JSON")
    99  
   100  	// url not found: https://jira.tsi-dev.otc-service.com/browse/BM-2474
   101  	// log.Printf("Create DIS Stream Policy Rule, Name: %s", streamName)
   102  	// err = streams.CreatePolicyRule(client, streams.CreatePolicyRuleOpts{
   103  	// 	StreamName:    streamName,
   104  	// 	StreamId:      getStream.StreamId,
   105  	// 	PrincipalName: client.DomainID,
   106  	// 	ActionType:    "putRecords",
   107  	// 	Effect:        "effect",
   108  	// })
   109  	// th.AssertNoErr(t, err)
   110  	//
   111  	// log.Printf("Get DIS Stream Policy Rule, Name: %s", streamName)
   112  	// rule, err := streams.GetPolicyRule(client, streamName)
   113  	// th.AssertNoErr(t, err)
   114  	// tools.PrintResource(t, rule)
   115  
   116  	log.Print("List DIS Streams")
   117  	listStreams, err := streams.ListStreams(client, streams.ListStreamsOpts{})
   118  	th.AssertNoErr(t, err)
   119  	th.AssertEquals(t, listStreams.StreamInfoList[0].DataType, "BLOB")
   120  
   121  	log.Printf("Commit DIS App Checkpoint, Name: %s", appName)
   122  	err = checkpoints.CommitCheckpoint(client, checkpoints.CommitCheckpointOpts{
   123  		AppName:        appName,
   124  		CheckpointType: "LAST_READ",
   125  		StreamName:     streamName,
   126  		PartitionId:    "0",
   127  		SequenceNumber: "0",
   128  	})
   129  	th.AssertNoErr(t, err)
   130  	t.Cleanup(func() {
   131  		log.Printf("Delete DIS App Checkpoint, Name: %s", appName)
   132  		err = checkpoints.DeleteCheckpoint(client, checkpoints.DeleteCheckpointOpts{
   133  			AppName:        appName,
   134  			StreamName:     streamName,
   135  			PartitionId:    "0",
   136  			CheckpointType: "LAST_READ",
   137  		})
   138  		th.AssertNoErr(t, err)
   139  	})
   140  
   141  	log.Printf("Get DIS App Checkpoint, Name: %s", appName)
   142  	checkpoint, err := checkpoints.GetCheckpoint(client, checkpoints.GetCheckpointOpts{
   143  		AppName:        appName,
   144  		StreamName:     streamName,
   145  		PartitionId:    "0",
   146  		CheckpointType: "LAST_READ",
   147  	})
   148  	th.AssertNoErr(t, err)
   149  	th.AssertEquals(t, checkpoint.SequenceNumber, "0")
   150  
   151  	log.Printf("Create DIS Stream Data records, Name: %s", streamName)
   152  	_, err = data.PutRecords(client, data.PutRecordsOpts{
   153  		StreamName: streamName,
   154  		StreamId:   getStream.StreamId,
   155  		Records: []data.PutRecordsRequestEntry{
   156  			{
   157  				Data: "dGVzdCBzdHJpbmc=",
   158  			},
   159  		},
   160  	})
   161  	th.AssertNoErr(t, err)
   162  
   163  	log.Printf("Create DIS Stream cursor, Name: %s", streamName)
   164  	cursor, err := data.GetCursor(client, data.GetCursorOpts{
   165  		StreamName:  streamName,
   166  		PartitionId: "0",
   167  	})
   168  	th.AssertNoErr(t, err)
   169  	tools.PrintResource(t, cursor)
   170  
   171  	log.Printf("Get DIS Stream records, Name: %s", streamName)
   172  	records, err := data.GetRecords(client, data.GetRecordsOpts{
   173  		PartitionCursor: cursor.PartitionCursor,
   174  	})
   175  	th.AssertNoErr(t, err)
   176  	tools.PrintResource(t, records)
   177  
   178  	log.Print("Querying Stream Monitoring Data")
   179  	streamMon, err := monitors.GetStreamMonitor(client, monitors.GetStreamMonitorOpts{
   180  		StreamName: streamName,
   181  		Label:      "total_put_bytes_per_stream",
   182  		StartTime:  now.Unix(),
   183  		EndTime:    now.Unix() + 50,
   184  	})
   185  	th.AssertNoErr(t, err)
   186  	th.AssertEquals(t, streamMon.Metrics.Label, "total_put_bytes_per_stream")
   187  
   188  	log.Print("Querying Partition Monitoring Data")
   189  	streamPartMon, err := monitors.GetPartitionMonitor(client, monitors.GetPartitionMonitorOpts{
   190  		PartitionId: "0",
   191  		StreamName:  streamName,
   192  		Label:       "total_put_bytes_per_partition",
   193  		StartTime:   now.Unix(),
   194  		EndTime:     now.Unix() + 50,
   195  	})
   196  	th.AssertNoErr(t, err)
   197  	th.AssertEquals(t, streamPartMon.Metrics.Label, "total_put_bytes_per_partition")
   198  }
   199  
   200  func TestDISDumpWorkflow(t *testing.T) {
   201  	t.Skip("Need to create dis_admin_agency first")
   202  	client, err := clients.NewDisV2Client()
   203  	th.AssertNoErr(t, err)
   204  
   205  	clientObs, err := clients.NewOBSClient()
   206  	th.AssertNoErr(t, err)
   207  
   208  	bucketName := strings.ToLower(tools.RandomString("obs-dis-test", 5))
   209  
   210  	_, err = clientObs.CreateBucket(&obs.CreateBucketInput{
   211  		Bucket: bucketName,
   212  	})
   213  	t.Cleanup(func() {
   214  		_, err = clientObs.DeleteBucket(bucketName)
   215  		th.AssertNoErr(t, err)
   216  	})
   217  	th.AssertNoErr(t, err)
   218  
   219  	appName := tools.RandomString("app-create-test-", 3)
   220  	log.Printf("Create DIS App, Name: %s", appName)
   221  	err = apps.CreateApp(client, apps.CreateAppOpts{
   222  		AppName: appName,
   223  	})
   224  	th.AssertNoErr(t, err)
   225  	t.Cleanup(func() {
   226  		log.Printf("Delete DIS App, Name: %s", appName)
   227  		err = apps.DeleteApp(client, appName)
   228  		th.AssertNoErr(t, err)
   229  	})
   230  
   231  	streamName := tools.RandomString("stream-create-test-", 3)
   232  	log.Printf("Create DIS Stream, Name: %s", streamName)
   233  	err = streams.CreateStream(client, streams.CreateStreamOpts{
   234  		StreamName:     streamName,
   235  		PartitionCount: 3,
   236  	})
   237  	th.AssertNoErr(t, err)
   238  	t.Cleanup(func() {
   239  		log.Printf("Delete DIS Stream, Name: %s", streamName)
   240  		err = streams.DeleteStream(client, streamName)
   241  		th.AssertNoErr(t, err)
   242  	})
   243  
   244  	taskName := tools.RandomString("task-create-test-", 3)
   245  	log.Printf("Delete DIS Dump task, Name: %s", taskName)
   246  	err = dump.CreateOBSDumpTask(client, dump.CreateOBSDumpTaskOpts{
   247  		StreamName:      streamName,
   248  		DestinationType: "OBS",
   249  		OBSDestinationDescriptor: dump.OBSDestinationDescriptorOpts{
   250  			TaskName:            taskName,
   251  			AgencyName:          "dis_admin_agency",
   252  			ConsumerStrategy:    "LATEST",
   253  			DestinationFileType: "text",
   254  			OBSBucketPath:       bucketName,
   255  			FilePrefix:          "",
   256  			PartitionFormat:     "yyyy/MM/dd/HH/mm",
   257  			RecordDelimiter:     "|",
   258  			DeliverTimeInterval: pointerto.Int(30),
   259  		},
   260  	})
   261  	th.AssertNoErr(t, err)
   262  
   263  	t.Cleanup(func() {
   264  		log.Printf("Delete DIS Dump task, Name: %s", taskName)
   265  		err = dump.DeleteTransferTask(client, dump.DeleteTransferTaskOpts{
   266  			StreamName: streamName,
   267  			TaskName:   taskName,
   268  		})
   269  		th.AssertNoErr(t, err)
   270  	})
   271  
   272  	log.Printf("Get DIS Dump task, Name: %s", taskName)
   273  	getDump, err := dump.GetTransferTask(client, dump.GetTransferTaskOpts{
   274  		StreamName: streamName,
   275  		TaskName:   taskName,
   276  	})
   277  	th.AssertNoErr(t, err)
   278  	th.AssertEquals(t, getDump.TaskName, taskName)
   279  
   280  	err = dump.TransferTaskAction(client, dump.TransferTaskActionOpts{
   281  		StreamName: streamName,
   282  		Action:     "stop",
   283  		Tasks: []dump.BatchTransferTask{
   284  			{
   285  				Id: getDump.TaskId,
   286  			},
   287  		},
   288  	})
   289  	th.AssertNoErr(t, err)
   290  
   291  	log.Printf("Check DIS Dump task state is paused, Name: %s", taskName)
   292  	stateDumpStopped, err := dump.GetTransferTask(client, dump.GetTransferTaskOpts{
   293  		StreamName: streamName,
   294  		TaskName:   taskName,
   295  	})
   296  	th.AssertNoErr(t, err)
   297  	th.AssertEquals(t, stateDumpStopped.State, "PAUSED")
   298  
   299  	log.Print("List DIS Dump tasks")
   300  	listTasks, err := dump.ListTransferTasks(client, streamName)
   301  	th.AssertNoErr(t, err)
   302  	th.AssertEquals(t, *listTasks.TotalNumber, 1)
   303  
   304  	err = dump.TransferTaskAction(client, dump.TransferTaskActionOpts{
   305  		StreamName: streamName,
   306  		Action:     "start",
   307  		Tasks: []dump.BatchTransferTask{
   308  			{
   309  				Id: getDump.TaskId,
   310  			},
   311  		},
   312  	})
   313  	th.AssertNoErr(t, err)
   314  
   315  	log.Printf("Check DIS Dump task state is running, Name: %s", taskName)
   316  	stateDumpStarted, err := dump.GetTransferTask(client, dump.GetTransferTaskOpts{
   317  		StreamName: streamName,
   318  		TaskName:   taskName,
   319  	})
   320  	th.AssertNoErr(t, err)
   321  	th.AssertEquals(t, stateDumpStarted.State, "RUNNING")
   322  }