From ac2083bdf1cdddc4187a2065f9ec55fd1635e16a Mon Sep 17 00:00:00 2001 From: Rodrigo Maia Date: Thu, 25 May 2023 20:52:38 +0000 Subject: [PATCH 1/2] feat(licenses): show license_expires time as rfc3339 date --- enterprise/cli/licenses.go | 22 ++++++++++++++++++++++ enterprise/cli/licenses_test.go | 8 ++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/enterprise/cli/licenses.go b/enterprise/cli/licenses.go index 37ed74c69a131..b2c601a1f9c2d 100644 --- a/enterprise/cli/licenses.go +++ b/enterprise/cli/licenses.go @@ -8,6 +8,7 @@ import ( "regexp" "strconv" "strings" + "time" "golang.org/x/xerrors" @@ -154,6 +155,10 @@ func (r *RootCmd) licensesList() *clibase.Cmd { licenses = make([]codersdk.License, 0) } + for _, license := range licenses { + convertLicenseExpireTime(license) + } + enc := json.NewEncoder(inv.Stdout) enc.SetIndent("", " ") return enc.Encode(licenses) @@ -187,3 +192,20 @@ func (r *RootCmd) licenseDelete() *clibase.Cmd { } return cmd } + +func convertLicenseExpireTime(license codersdk.License) codersdk.License { + if license.Claims["license_expires"] != nil { + value, ok := license.Claims["license_expires"].(json.Number) + if !ok { + return license + } + int64Value, err := value.Int64() + if err != nil { + return license + } + t := time.Unix(int64Value, 0) + rfc3339Format := t.Format(time.RFC3339) + license.Claims["license_expires"] = rfc3339Format + } + return license +} diff --git a/enterprise/cli/licenses_test.go b/enterprise/cli/licenses_test.go index dd07287161708..e9d0d2ee8403f 100644 --- a/enterprise/cli/licenses_test.go +++ b/enterprise/cli/licenses_test.go @@ -158,6 +158,8 @@ func TestLicensesListFake(t *testing.T) { assert.Equal(t, "claim1", licenses[0].Claims["h1"]) assert.Equal(t, int32(5), licenses[1].ID) assert.Equal(t, "claim2", licenses[1].Claims["h2"]) + assert.Equal(t, "2024-04-06T16:53:35Z", licenses[0].Claims["license_expires"]) + assert.Equal(t, "anyvalue", licenses[1].Claims["license_expires"]) // keep value if not a time }) } @@ -294,7 +296,8 @@ func (s *fakeLicenseAPI) licenses(rw http.ResponseWriter, _ *http.Request) { ID: 1, UploadedAt: time.Now(), Claims: map[string]interface{}{ - "h1": "claim1", + "license_expires": 1712422415, + "h1": "claim1", "features": map[string]int64{ "f1": 1, "f2": 2, @@ -305,7 +308,8 @@ func (s *fakeLicenseAPI) licenses(rw http.ResponseWriter, _ *http.Request) { ID: 5, UploadedAt: time.Now(), Claims: map[string]interface{}{ - "h2": "claim2", + "license_expires": "anyvalue", + "h2": "claim2", "features": map[string]int64{ "f3": 3, "f4": 4, From 31513ee89aaac14d7d2c2a113e7123f30dd55dec Mon Sep 17 00:00:00 2001 From: Rodrigo Maia Date: Fri, 26 May 2023 14:28:00 +0000 Subject: [PATCH 2/2] fix review comments --- enterprise/cli/licenses.go | 35 ++++++++++++++++++++++----------- enterprise/cli/licenses_test.go | 4 +--- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/enterprise/cli/licenses.go b/enterprise/cli/licenses.go index b2c601a1f9c2d..1ed12669ae9b0 100644 --- a/enterprise/cli/licenses.go +++ b/enterprise/cli/licenses.go @@ -155,8 +155,12 @@ func (r *RootCmd) licensesList() *clibase.Cmd { licenses = make([]codersdk.License, 0) } - for _, license := range licenses { - convertLicenseExpireTime(license) + for i, license := range licenses { + newClaims, err := convertLicenseExpireTime(license.Claims) + if err != nil { + return err + } + licenses[i].Claims = newClaims } enc := json.NewEncoder(inv.Stdout) @@ -193,19 +197,28 @@ func (r *RootCmd) licenseDelete() *clibase.Cmd { return cmd } -func convertLicenseExpireTime(license codersdk.License) codersdk.License { - if license.Claims["license_expires"] != nil { - value, ok := license.Claims["license_expires"].(json.Number) +func convertLicenseExpireTime(licenseClaims map[string]interface{}) (map[string]interface{}, error) { + if licenseClaims["license_expires"] != nil { + licenseExpiresNumber, ok := licenseClaims["license_expires"].(json.Number) if !ok { - return license + return licenseClaims, xerrors.Errorf("could not convert license_expires to json.Number") } - int64Value, err := value.Int64() + + licenseExpires, err := licenseExpiresNumber.Int64() if err != nil { - return license + return licenseClaims, xerrors.Errorf("could not convert license_expires to int64: %w", err) } - t := time.Unix(int64Value, 0) + + t := time.Unix(licenseExpires, 0) rfc3339Format := t.Format(time.RFC3339) - license.Claims["license_expires"] = rfc3339Format + + claimsCopy := make(map[string]interface{}, len(licenseClaims)) + for k, v := range licenseClaims { + claimsCopy[k] = v + } + + claimsCopy["license_expires"] = rfc3339Format + return claimsCopy, nil } - return license + return licenseClaims, nil } diff --git a/enterprise/cli/licenses_test.go b/enterprise/cli/licenses_test.go index e9d0d2ee8403f..77d6dd15abd87 100644 --- a/enterprise/cli/licenses_test.go +++ b/enterprise/cli/licenses_test.go @@ -159,7 +159,6 @@ func TestLicensesListFake(t *testing.T) { assert.Equal(t, int32(5), licenses[1].ID) assert.Equal(t, "claim2", licenses[1].Claims["h2"]) assert.Equal(t, "2024-04-06T16:53:35Z", licenses[0].Claims["license_expires"]) - assert.Equal(t, "anyvalue", licenses[1].Claims["license_expires"]) // keep value if not a time }) } @@ -308,8 +307,7 @@ func (s *fakeLicenseAPI) licenses(rw http.ResponseWriter, _ *http.Request) { ID: 5, UploadedAt: time.Now(), Claims: map[string]interface{}{ - "license_expires": "anyvalue", - "h2": "claim2", + "h2": "claim2", "features": map[string]int64{ "f3": 3, "f4": 4,