diff --git a/internal/apiclient/v20250101/api.gen.go b/internal/apiclient/v20250101/api.gen.go index 3844336bbddfea9e53daad145ba925da44c70ce1..cc8f979f2c168e147742e579dde464c934f8ce3d 100644 --- a/internal/apiclient/v20250101/api.gen.go +++ b/internal/apiclient/v20250101/api.gen.go @@ -74,6 +74,7 @@ const ( Ownership DevicePatchRemove = "ownership" Serial DevicePatchRemove = "serial" Tags DevicePatchRemove = "tags" + UserEmail DevicePatchRemove = "userEmail" ) // Defines values for NewAuthorityType. @@ -464,6 +465,11 @@ type DevicePatch struct { // Tags A set of tags that can be used to group devices. Tags *DeviceTags `json:"tags,omitempty"` + + // UserEmail The email of the user the device is assigned to. + // This field may be populated with a value derived from data synced from your team's MDMs. + // Setting this value explicitly will mask any MDM-derived value. + UserEmail *string `json:"userEmail,omitempty"` } // DevicePatchRemove defines model for DevicePatch.Remove. @@ -6054,159 +6060,159 @@ var swaggerSpec = []string{ "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", - "Z+4Zvvg8WJz1u4uz3gJb/Zdfh589PDm+evHm2tlFr/d92Hj5DtZf4OvBu9qru/lXe/lyvzp6FY6b49cD", - "c/h2ethqw5P9V9eXl6PG6csvbxcvF7j7on9+EX29Px6OXpz0F9Og77y5e1WdN+Grva99/8t993rcHXaq", - "J1+O3pjjT69f7g0fHoYnd8fh/PRib9Z63WqQ4Wt6vv/l8l3YfO28ehi2L2pv8dHXLz3nXRs1TbKcHr39", - "NJm+QW/d08HJtXW3INMXF114MTq/J8PG6Lzxvr67b93DI3h+3vPt9w8L02u+rluHl4d7HTuE84592dkj", - "Z/T1fHrSfxvAzw8WmgSv+4N+q3k6Oz4eWa/OzE/z3dm0eQm/Hn51Tw7p9Hh+Ync+Rxe1+8b5LnrAjtmn", - "k+DOI7tkdDxxdiedy05z7zSYjGefLuze4NP7Qf0tPN1FNr4mb8Z48NC7W/YvWnfL6y/vv0a0eTo1dy2r", - "sesfzacBGd5NnHa4a9nWW2KZTmt8v3s/6+P3d++++N3BGTwZTMfn++6rzuzz5y/NAQrfvz+p9dve6VF0", - "ufhkudGi6jVOyN1X6vbvzk/33r46vD8dNU8XcQn1lt1Bk8Z+zbTs2tRsQVg3J3C/bXYsOG1Be7o3hZaR", - "eIWhMzMOjMFIWEat4J4pBab4646P530ZLJr9F4ftLxD69jj4cvfJ879evei/PYJn48MX+8Np9GbaCjx8", - "xvqES253FWm+THBjpqY8GAfGu65/FnVQ96TrTk/P8SwcNUMn3HvRdK3WwzvLikjXf3XUwfc9thY2zPGr", - "2fDwvXlh1cLu2/HnzjsX7c9PX7/qBX4zmnp3rlsPrS/7F1FNOS+NsyUo9Uyz84h7tuRN/IOByOyvjOxg", - "50iOeZtmrZVn3uRe98EodI/vV3x0Hi7HENm263vtZr1hTnetmtlqNXbNPThtmHa9Ntltt/ZsC06Nwj1I", - "vKdeyzzcUq7z82OXLZDPaDU7k1q7MTF36+2a2drrWOakvW+ZNXvPqiPLRrt8xnTgt+38uIF4gu1D2csJ", - "/Odqtaqt8c9/VM5ldtoz4NSnmjZ5YSl5IEm6P8XippNma2/aMKftac1s7e83zf3WXsNs2y3U2a3BerOG", - "ss/dyBeo1NUpLx9lnqbnGgsnFM3zhB/it+6KT9X9IJ6ShUqvB1tno9NptHYnNbMxaSCz1aztm5NJu2W2", - "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", - "+PHx/wUAAP//it8lPwsQAQA=", + "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/internal/provider/device/model.go b/internal/provider/device/model.go index 9b1ad8395b3bca4ee38fae41b958242273c79ef0..4f6d9a185de799dfaae293938c9846fba767ec8c 100644 --- a/internal/provider/device/model.go +++ b/internal/provider/device/model.go @@ -161,7 +161,7 @@ func toAPI(ctx context.Context, m *Model) (*v20250101.DeviceRequest, diag.Diagno if !m.Ownership.IsNull() && !m.Ownership.IsUnknown() { d.Ownership = utils.Ref(v20250101.DeviceOwnership(m.Ownership.ValueString())) } - if !m.Metadata.IsNull() && !m.Ownership.IsUnknown() { + if !m.Metadata.IsNull() && !m.Metadata.IsUnknown() { meta := map[string]types.String{} diag := m.Metadata.ElementsAs(ctx, &meta, false) diags.Append(diag...) diff --git a/internal/provider/device/resource.go b/internal/provider/device/resource.go index e42b287629d2b222fe471ef5f508921ac57ae591..93a3f3a84901beed2476ca35f28c605f26a3c662 100644 --- a/internal/provider/device/resource.go +++ b/internal/provider/device/resource.go @@ -271,60 +271,105 @@ func (a *Resource) Create(ctx context.Context, req resource.CreateRequest, resp } func (r *Resource) Update(ctx context.Context, req resource.UpdateRequest, resp *resource.UpdateResponse) { - resp.Diagnostics.AddError( - "Update not supported", - "All changes require replacement", - ) - /* - plan := &Model{} - diags := req.Plan.Get(ctx, plan) - if diags.HasError() { - resp.Diagnostics.Append(diags...) - return - } - var deviceID string - req.State.GetAttribute(ctx, path.Root("id"), &deviceID) - - patch, diags := toAPI(ctx, plan) - if diags.HasError() { - resp.Diagnostics.Append(diags...) - return - } - - httpResp, err := r.client.PatchDevice(ctx, deviceID, &v20250101.PatchDeviceParams{}, *patch) - if err != nil { - resp.Diagnostics.AddError( - "Smallstep API Client Error", - err.Error(), - ) - return - } - defer httpResp.Body.Close() - - if httpResp.StatusCode != http.StatusOK { - reqID := httpResp.Header.Get("X-Request-Id") - resp.Diagnostics.AddError( - "Smallstep API Response Error", - fmt.Sprintf("Request %q received status %d updating device: %s", reqID, httpResp.StatusCode, utils.APIErrorMsg(httpResp.Body)), - ) - return - } - - device := &v20250101.Device{} - if err := json.NewDecoder(httpResp.Body).Decode(device); err != nil { - resp.Diagnostics.AddError( - "Smallstep API Client Error", - fmt.Sprintf("Failed to parse device update response: %v", err), - ) - return - } - - model, diags := fromAPI(ctx, device, req.Plan) + plan := &Model{} + diags := req.Plan.Get(ctx, plan) + if diags.HasError() { resp.Diagnostics.Append(diags...) + return + } + var deviceID string + req.State.GetAttribute(ctx, path.Root("id"), &deviceID) - diags = resp.State.Set(ctx, model) + resource, diags := toAPI(ctx, plan) + if diags.HasError() { resp.Diagnostics.Append(diags...) - */ + return + } + + patch := v20250101.DevicePatch{} + var remove []v20250101.DevicePatchRemove + + if resource.DisplayId == nil { + remove = append(remove, v20250101.DisplayId) + } else { + patch.DisplayId = resource.DisplayId + } + + if resource.DisplayName == nil { + remove = append(remove, v20250101.DisplayName) + } else { + patch.DisplayName = resource.DisplayName + } + + if resource.Metadata == nil { + remove = append(remove, v20250101.Metadata) + } else { + patch.Metadata = resource.Metadata + } + + if resource.Os == nil { + remove = append(remove, v20250101.Os) + } else { + patch.Os = resource.Os + } + + if resource.Ownership == nil { + remove = append(remove, v20250101.Ownership) + } else { + patch.Ownership = resource.Ownership + } + + if resource.Serial == nil { + remove = append(remove, v20250101.Serial) + } else { + patch.Serial = resource.Serial + } + + if resource.Tags == nil { + remove = append(remove, v20250101.Tags) + } else { + patch.Tags = resource.Tags + } + + if resource.User == nil || resource.User.Email == "" { + remove = append(remove, v20250101.UserEmail) + } else { + patch.UserEmail = &resource.User.Email + } + + httpResp, err := r.client.PatchDevice(ctx, deviceID, &v20250101.PatchDeviceParams{}, patch) + if err != nil { + resp.Diagnostics.AddError( + "Smallstep API Client Error", + err.Error(), + ) + return + } + defer httpResp.Body.Close() + + if httpResp.StatusCode != http.StatusOK { + reqID := httpResp.Header.Get("X-Request-Id") + resp.Diagnostics.AddError( + "Smallstep API Response Error", + fmt.Sprintf("Request %q received status %d updating device: %s", reqID, httpResp.StatusCode, utils.APIErrorMsg(httpResp.Body)), + ) + return + } + + device := &v20250101.Device{} + if err := json.NewDecoder(httpResp.Body).Decode(device); err != nil { + resp.Diagnostics.AddError( + "Smallstep API Client Error", + fmt.Sprintf("Failed to parse device update response: %v", err), + ) + return + } + + model, diags := fromAPI(ctx, device, req.Plan) + resp.Diagnostics.Append(diags...) + + diags = resp.State.Set(ctx, model) + resp.Diagnostics.Append(diags...) } func (r *Resource) Delete(ctx context.Context, req resource.DeleteRequest, resp *resource.DeleteResponse) { diff --git a/internal/provider/device/resource_test.go b/internal/provider/device/resource_test.go index 4b119050f402297460cdb9034518b6bb6ddfe6f1..5eb16e697e1ba55726686834dafede475e08bc19 100644 --- a/internal/provider/device/resource_test.go +++ b/internal/provider/device/resource_test.go @@ -56,14 +56,23 @@ resource "smallstep_device" "laptop1" { }, }) - permanentID = uuid.NewString() + permanentID2 := uuid.NewString() fullConfig := fmt.Sprintf(` resource "smallstep_device" "laptop1" { permanent_identifier = %q display_id = "9 9" + display_name = "Employee Laptop" serial = "678" tags = ["ubuntu"] -}`, permanentID) + metadata = { + k1 = "v1" + } + os = "Windows" + ownership = "company" + user = { + email = "user@example.com" + } +}`, permanentID2) helper.Test(t, helper.TestCase{ ProtoV6ProviderFactories: providerFactories, @@ -72,10 +81,74 @@ resource "smallstep_device" "laptop1" { Config: fullConfig, Check: helper.ComposeAggregateTestCheckFunc( helper.TestMatchResourceAttr("smallstep_device.laptop1", "id", regexp.MustCompile(`^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`)), - helper.TestCheckResourceAttr("smallstep_device.laptop1", "permanent_identifier", permanentID), + helper.TestCheckResourceAttr("smallstep_device.laptop1", "permanent_identifier", permanentID2), + helper.TestCheckResourceAttr("smallstep_device.laptop1", "display_id", "9 9"), + helper.TestCheckResourceAttr("smallstep_device.laptop1", "display_name", "Employee Laptop"), + helper.TestCheckResourceAttr("smallstep_device.laptop1", "serial", "678"), + helper.TestCheckResourceAttr("smallstep_device.laptop1", "user.email", "user@example.com"), + helper.TestCheckResourceAttr("smallstep_device.laptop1", "os", "Windows"), + helper.TestCheckResourceAttr("smallstep_device.laptop1", "ownership", "company"), + helper.TestCheckResourceAttr("smallstep_device.laptop1", "tags.0", "ubuntu"), + helper.TestCheckResourceAttr("smallstep_device.laptop1", "metadata.k1", "v1"), + helper.TestCheckResourceAttr("smallstep_device.laptop1", "connected", "false"), + helper.TestCheckResourceAttr("smallstep_device.laptop1", "high_assurance", "false"), + helper.TestCheckNoResourceAttr("smallstep_device.laptop1", "enrolled_at"), + helper.TestCheckNoResourceAttr("smallstep_device.laptop1", "last_seen"), + ), + }, + { + ResourceName: "smallstep_device.laptop1", + ImportState: true, + ImportStateVerify: true, + }, + }, + }) + + permanentID3 := uuid.NewString() + config1 := fmt.Sprintf(` +resource "smallstep_device" "laptop1" { + permanent_identifier = %q +}`, permanentID3) + config2 := fmt.Sprintf(` +resource "smallstep_device" "laptop1" { + permanent_identifier = %q + display_id = "9 9" + display_name = "Employee Laptop" + serial = "678" + tags = ["ubuntu"] + metadata = { + k1 = "v1" + } + os = "Windows" + ownership = "company" + user = { + email = "user@example.com" + } +}`, permanentID3) + + helper.Test(t, helper.TestCase{ + ProtoV6ProviderFactories: providerFactories, + Steps: []helper.TestStep{ + { + Config: config1, + }, + { + Config: config2, + Check: helper.ComposeAggregateTestCheckFunc( + helper.TestMatchResourceAttr("smallstep_device.laptop1", "id", regexp.MustCompile(`^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`)), + helper.TestCheckResourceAttr("smallstep_device.laptop1", "permanent_identifier", permanentID3), helper.TestCheckResourceAttr("smallstep_device.laptop1", "display_id", "9 9"), + helper.TestCheckResourceAttr("smallstep_device.laptop1", "display_name", "Employee Laptop"), helper.TestCheckResourceAttr("smallstep_device.laptop1", "serial", "678"), + helper.TestCheckResourceAttr("smallstep_device.laptop1", "user.email", "user@example.com"), + helper.TestCheckResourceAttr("smallstep_device.laptop1", "os", "Windows"), + helper.TestCheckResourceAttr("smallstep_device.laptop1", "ownership", "company"), helper.TestCheckResourceAttr("smallstep_device.laptop1", "tags.0", "ubuntu"), + helper.TestCheckResourceAttr("smallstep_device.laptop1", "metadata.k1", "v1"), + helper.TestCheckResourceAttr("smallstep_device.laptop1", "connected", "false"), + helper.TestCheckResourceAttr("smallstep_device.laptop1", "high_assurance", "false"), + helper.TestCheckNoResourceAttr("smallstep_device.laptop1", "enrolled_at"), + helper.TestCheckNoResourceAttr("smallstep_device.laptop1", "last_seen"), ), }, {