diff --git a/comprehensive b/comprehensive new file mode 100755 index 0000000..d780051 Binary files /dev/null and b/comprehensive differ diff --git a/internal/apply/v2/planner.go b/internal/apply/v2/planner.go index 797a411..7253977 100644 --- a/internal/apply/v2/planner.go +++ b/internal/apply/v2/planner.go @@ -360,7 +360,6 @@ func (p *EdgeConnectPlanner) getCurrentInstanceState(ctx context.Context, desire CloudletName: instance.Key.CloudletKey.Name, FlavorName: instance.Flavor.Name, State: instance.State, - PowerState: instance.PowerState, Exists: true, LastUpdated: time.Now(), // EdgeConnect doesn't provide this } diff --git a/internal/apply/v2/planner_test.go b/internal/apply/v2/planner_test.go index 3fbdbc3..fb390dd 100644 --- a/internal/apply/v2/planner_test.go +++ b/internal/apply/v2/planner_test.go @@ -223,8 +223,7 @@ func TestPlanExistingDeploymentNoChanges(t *testing.T) { Flavor: v2.Flavor{ Name: "small", }, - State: "Ready", - PowerState: "PowerOn", + State: "Ready", } mockClient.On("ShowApp", mock.Anything, mock.AnythingOfType("v2.AppKey"), "US"). diff --git a/internal/apply/v2/types.go b/internal/apply/v2/types.go index 26d998e..c7ca07c 100644 --- a/internal/apply/v2/types.go +++ b/internal/apply/v2/types.go @@ -170,9 +170,6 @@ type InstanceState struct { // State of the instance (e.g., "Ready", "Pending", "Error") State string - // PowerState of the instance - PowerState string - // LastUpdated timestamp when the instance was last modified LastUpdated time.Time diff --git a/sdk/edgeconnect/appinstance.go b/sdk/edgeconnect/appinstance.go index 34e3486..a4e70f5 100644 --- a/sdk/edgeconnect/appinstance.go +++ b/sdk/edgeconnect/appinstance.go @@ -213,10 +213,20 @@ func (c *Client) parseStreamingAppInstanceResponse(resp *http.Response, result i var errorMessage string parseErr := sdkhttp.ParseJSONLines(resp.Body, func(line []byte) error { - // On permission denied, Edge API returns just an empty array []! - if len(line) == 0 || line[0] == '[' { + if len(line) == 0 { return fmt.Errorf("%w", ErrFaultyResponsePerhaps403) } + + // Handle array responses (current API format) + if line[0] == '[' { + var directInstances []AppInstance + if err := json.Unmarshal(line, &directInstances); err != nil { + return err + } + appInstances = append(appInstances, directInstances...) + return nil + } + // Try parsing as ResultResponse first (error format) var resultResp ResultResponse if err := json.Unmarshal(line, &resultResp); err == nil && resultResp.Result.Message != "" { @@ -228,7 +238,7 @@ func (c *Client) parseStreamingAppInstanceResponse(resp *http.Response, result i return nil } - // Try parsing as Response[AppInstance] + // Try parsing as Response[AppInstance] (legacy streaming format) var response Response[AppInstance] if err := json.Unmarshal(line, &response); err != nil { return err diff --git a/sdk/edgeconnect/apps.go b/sdk/edgeconnect/apps.go index a086475..e2c4c07 100644 --- a/sdk/edgeconnect/apps.go +++ b/sdk/edgeconnect/apps.go @@ -180,10 +180,23 @@ func (c *Client) parseStreamingResponse(resp *http.Response, result interface{}) var responses []Response[App] parseErr := sdkhttp.ParseJSONLines(resp.Body, func(line []byte) error { - // On permission denied, Edge API returns just an empty array []! - if len(line) == 0 || line[0] == '[' { + if len(line) == 0 { return fmt.Errorf("%w", ErrFaultyResponsePerhaps403) } + + // Handle array responses (current API format) + if line[0] == '[' { + var directApps []App + if err := json.Unmarshal(line, &directApps); err != nil { + return err + } + for _, app := range directApps { + responses = append(responses, Response[App]{Data: app}) + } + return nil + } + + // Try parsing as Response[App] (legacy streaming format) var response Response[App] if err := json.Unmarshal(line, &response); err != nil { return err diff --git a/sdk/edgeconnect/cloudlet.go b/sdk/edgeconnect/cloudlet.go index 142b9d6..6885539 100644 --- a/sdk/edgeconnect/cloudlet.go +++ b/sdk/edgeconnect/cloudlet.go @@ -229,6 +229,23 @@ func (c *Client) parseStreamingCloudletResponse(resp *http.Response, result inte var responses []Response[Cloudlet] parseErr := sdkhttp.ParseJSONLines(resp.Body, func(line []byte) error { + if len(line) == 0 { + return fmt.Errorf("%w", ErrFaultyResponsePerhaps403) + } + + // Handle array responses (current API format) + if line[0] == '[' { + var directCloudlets []Cloudlet + if err := json.Unmarshal(line, &directCloudlets); err != nil { + return err + } + for _, cl := range directCloudlets { + responses = append(responses, Response[Cloudlet]{Data: cl}) + } + return nil + } + + // Try parsing as Response[Cloudlet] (legacy streaming format) var response Response[Cloudlet] if err := json.Unmarshal(line, &response); err != nil { return err diff --git a/sdk/edgeconnect/v2/appinstance_test.go b/sdk/edgeconnect/v2/appinstance_test.go index 04df669..ec31c17 100644 --- a/sdk/edgeconnect/v2/appinstance_test.go +++ b/sdk/edgeconnect/v2/appinstance_test.go @@ -300,8 +300,7 @@ func TestUpdateAppInstance(t *testing.T) { Name: "testapp", Version: "1.0.0", }, - Flavor: Flavor{Name: "m4.medium"}, - PowerState: "PowerOn", + Flavor: Flavor{Name: "m4.medium"}, }, }, mockStatusCode: 200, diff --git a/sdk/edgeconnect/v2/types.go b/sdk/edgeconnect/v2/types.go index cdaa1ac..ccae8b4 100644 --- a/sdk/edgeconnect/v2/types.go +++ b/sdk/edgeconnect/v2/types.go @@ -113,7 +113,6 @@ const ( AppInstFieldConfigsKind = "27.1" AppInstFieldConfigsConfig = "27.2" AppInstFieldHealthCheck = "29" - AppInstFieldPowerState = "31" AppInstFieldExternalVolumeSize = "32" AppInstFieldAvailabilityZone = "33" AppInstFieldVmFlavor = "34" @@ -201,7 +200,6 @@ type App struct { GlobalID string `json:"global_id,omitempty"` CreatedAt string `json:"created_at,omitempty"` UpdatedAt string `json:"updated_at,omitempty"` - Fields []string `json:"fields,omitempty"` } // AppInstance represents a deployed application instance @@ -216,8 +214,6 @@ type AppInstance struct { UniqueID string `json:"unique_id,omitempty"` CreatedAt string `json:"created_at,omitempty"` UpdatedAt string `json:"updated_at,omitempty"` - PowerState string `json:"power_state,omitempty"` - Fields []string `json:"fields,omitempty"` } // Cloudlet represents edge infrastructure diff --git a/sdk/examples/comprehensive/main.go b/sdk/examples/comprehensive/main.go index 77c1980..02a0730 100644 --- a/sdk/examples/comprehensive/main.go +++ b/sdk/examples/comprehensive/main.go @@ -203,7 +203,6 @@ func runComprehensiveWorkflow(ctx context.Context, c *v2.Client, config Workflow fmt.Printf(" • Cloudlet: %s/%s\n", instanceDetails.Key.CloudletKey.Organization, instanceDetails.Key.CloudletKey.Name) fmt.Printf(" • Flavor: %s\n", instanceDetails.Flavor.Name) fmt.Printf(" • State: %s\n", instanceDetails.State) - fmt.Printf(" • Power State: %s\n", instanceDetails.PowerState) // 6. List Application Instances fmt.Println("\n6️⃣ Listing application instances...") @@ -328,11 +327,7 @@ func waitForInstanceReady(ctx context.Context, c *v2.Client, instanceKey v2.AppI continue } - fmt.Printf(" 📊 Instance state: %s", instance.State) - if instance.PowerState != "" { - fmt.Printf(" (power: %s)", instance.PowerState) - } - fmt.Printf("\n") + fmt.Printf(" 📊 Instance state: %s\n", instance.State) // Check if instance is ready (not in creating state) state := strings.ToLower(instance.State)