@@ -1016,6 +1016,146 @@ func TestServiceLifecycleIntegration(t *testing.T) {
10161016 }
10171017 })
10181018
1019+ t .Run ("ResizeService" , func (t * testing.T ) {
1020+ if serviceID == "" {
1021+ t .Skip ("No service ID available from create test" )
1022+ }
1023+
1024+ t .Logf ("Resizing service: %s" , serviceID )
1025+
1026+ // First, get current service details to see current CPU/memory
1027+ output , err := executeIntegrationCommand (
1028+ t .Context (),
1029+ "service" , "describe" , serviceID ,
1030+ "--output" , "json" ,
1031+ )
1032+
1033+ if err != nil {
1034+ t .Fatalf ("Failed to describe service before resize: %v\n Output: %s" , err , output )
1035+ }
1036+
1037+ // Parse JSON to check current resources
1038+ var serviceBefore api.Service
1039+ if err := json .Unmarshal ([]byte (output ), & serviceBefore ); err != nil {
1040+ t .Fatalf ("Failed to parse service JSON: %v" , err )
1041+ }
1042+
1043+ var currentCPU , currentMemory string
1044+ if serviceBefore .Resources != nil && len (* serviceBefore .Resources ) > 0 {
1045+ resource := (* serviceBefore .Resources )[0 ]
1046+ if resource .Spec != nil {
1047+ if resource .Spec .CpuMillis != nil {
1048+ cpuCores := float64 (* resource .Spec .CpuMillis ) / 1000
1049+ currentCPU = fmt .Sprintf ("%.1f CPU" , cpuCores )
1050+ }
1051+ if resource .Spec .MemoryGbs != nil {
1052+ currentMemory = fmt .Sprintf ("%d GB" , * resource .Spec .MemoryGbs )
1053+ }
1054+ }
1055+ }
1056+
1057+ t .Logf ("Current resources: CPU=%s, Memory=%s" , currentCPU , currentMemory )
1058+
1059+ // Resize to 1 CPU / 4 GB (larger than default 0.5 CPU / 2 GB)
1060+ // Note: --cpu expects millicores (1000 = 1 CPU), --memory expects GB as integer
1061+ targetCPUMillis := "1000" // 1 CPU = 1000 millicores
1062+ targetMemoryGB := "4" // 4 GB
1063+
1064+ t .Logf ("Resizing to: CPU=%s millicores (1 CPU), Memory=%s GB" , targetCPUMillis , targetMemoryGB )
1065+
1066+ output , err = executeIntegrationCommand (
1067+ t .Context (),
1068+ "service" , "resize" , serviceID ,
1069+ "--cpu" , targetCPUMillis ,
1070+ "--memory" , targetMemoryGB ,
1071+ "--wait-timeout" , "10m" , // Longer timeout for resize operations
1072+ )
1073+
1074+ if err != nil {
1075+ t .Fatalf ("Service resize failed: %v\n Output: %s" , err , output )
1076+ }
1077+
1078+ // Verify resize success message
1079+ if ! strings .Contains (output , "Resize completed successfully" ) &&
1080+ ! strings .Contains (output , "resized successfully" ) {
1081+ t .Logf ("Note: Expected resize success message, got: %s" , output )
1082+ }
1083+
1084+ t .Logf ("Service resize command completed successfully" )
1085+ })
1086+
1087+ t .Run ("VerifyServiceResized" , func (t * testing.T ) {
1088+ if serviceID == "" {
1089+ t .Skip ("No service ID available from create test" )
1090+ }
1091+
1092+ t .Logf ("Verifying service has been resized" )
1093+
1094+ output , err := executeIntegrationCommand (
1095+ t .Context (),
1096+ "service" , "describe" , serviceID ,
1097+ "--output" , "json" ,
1098+ )
1099+
1100+ if err != nil {
1101+ t .Fatalf ("Failed to describe service after resize: %v\n Output: %s" , err , output )
1102+ }
1103+
1104+ // Parse JSON to check new resources
1105+ var serviceAfter api.Service
1106+ if err := json .Unmarshal ([]byte (output ), & serviceAfter ); err != nil {
1107+ t .Fatalf ("Failed to parse service JSON: %v" , err )
1108+ }
1109+
1110+ var newCPUMillis , newMemoryGbs int
1111+ if serviceAfter .Resources != nil && len (* serviceAfter .Resources ) > 0 {
1112+ resource := (* serviceAfter .Resources )[0 ]
1113+ if resource .Spec != nil {
1114+ if resource .Spec .CpuMillis != nil {
1115+ newCPUMillis = * resource .Spec .CpuMillis
1116+ }
1117+ if resource .Spec .MemoryGbs != nil {
1118+ newMemoryGbs = * resource .Spec .MemoryGbs
1119+ }
1120+ }
1121+ }
1122+
1123+ newCPU := fmt .Sprintf ("%.1f CPU" , float64 (newCPUMillis )/ 1000 )
1124+ newMemory := fmt .Sprintf ("%d GB" , newMemoryGbs )
1125+
1126+ t .Logf ("New resources after resize: CPU=%s (millis=%d), Memory=%s" , newCPU , newCPUMillis , newMemory )
1127+
1128+ // Verify the service has been resized to expected values
1129+ expectedCPUMillis := 1000 // 1 CPU = 1000 millicores
1130+ expectedMemoryGbs := 4 // 4 GB
1131+
1132+ if newCPUMillis != expectedCPUMillis {
1133+ t .Errorf ("Expected CPU to be %d millicores after resize, got %d" , expectedCPUMillis , newCPUMillis )
1134+ } else {
1135+ t .Logf ("✅ CPU correctly resized to %d millicores (1 CPU)" , newCPUMillis )
1136+ }
1137+
1138+ if newMemoryGbs != expectedMemoryGbs {
1139+ t .Errorf ("Expected Memory to be %d GB after resize, got %d" , expectedMemoryGbs , newMemoryGbs )
1140+ } else {
1141+ t .Logf ("✅ Memory correctly resized to %d GB" , newMemoryGbs )
1142+ }
1143+
1144+ // Verify service is still in READY state after resize
1145+ var status string
1146+ if serviceAfter .Status != nil {
1147+ status = string (* serviceAfter .Status )
1148+ }
1149+
1150+ if status != "READY" {
1151+ t .Logf ("Warning: Expected service status to be READY after resize, got %s" , status )
1152+ } else {
1153+ t .Logf ("✅ Service is correctly in READY state after resize" )
1154+ }
1155+
1156+ t .Logf ("✅ Service resize verified successfully" )
1157+ })
1158+
10191159 t .Run ("DeleteService" , func (t * testing.T ) {
10201160 if serviceID == "" {
10211161 t .Skip ("No service ID available for deletion" )
@@ -1572,6 +1712,11 @@ func TestServiceForkIntegration(t *testing.T) {
15721712 t .Fatalf ("Login failed: %v\n Output: %s" , err , output )
15731713 }
15741714
1715+ // Verify login success message
1716+ if ! strings .Contains (output , "Successfully logged in" ) && ! strings .Contains (output , "Logged in" ) {
1717+ t .Errorf ("Login output: %s" , output )
1718+ }
1719+
15751720 t .Logf ("Login successful" )
15761721 })
15771722
0 commit comments