Thanks to visit codestin.com
Credit goes to github.com

Skip to content
This repository was archived by the owner on Aug 30, 2024. It is now read-only.

Cleanup and export entclient #95

Merged
merged 2 commits into from
Aug 17, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions ci/integration/users_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import (
"testing"

"cdr.dev/coder-cli/ci/tcli"
"cdr.dev/coder-cli/internal/entclient"
"cdr.dev/coder-cli/coder-sdk"
"cdr.dev/slog/sloggers/slogtest/assert"
)

Expand All @@ -20,7 +20,7 @@ func TestUsers(t *testing.T) {

headlessLogin(ctx, t, c)

var user entclient.User
var user coder.User
c.Run(ctx, `coder users ls --output json | jq -c '.[] | select( .username == "charlie")'`).Assert(t,
tcli.Success(),
tcli.StdoutJSONUnmarshal(&user),
Expand Down
7 changes: 3 additions & 4 deletions internal/entclient/activity.go → coder-sdk/activity.go
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package entclient
package coder

import (
"context"
"net/http"
)

// PushActivity pushes CLI activity to Coder
// PushActivity pushes CLI activity to Coder.
func (c Client) PushActivity(ctx context.Context, source string, envID string) error {
res, err := c.request(ctx, "POST", "/api/metrics/usage/push", map[string]string{
res, err := c.request(ctx, http.MethodPost, "/api/metrics/usage/push", map[string]string{
"source": source,
"environment_id": envID,
})
Expand All @@ -18,6 +18,5 @@ func (c Client) PushActivity(ctx context.Context, source string, envID string) e
if res.StatusCode != http.StatusOK {
return bodyError(res)
}

return nil
}
2 changes: 1 addition & 1 deletion internal/entclient/client.go → coder-sdk/client.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package entclient
package coder

import (
"net/http"
Expand Down
8 changes: 4 additions & 4 deletions internal/entclient/devurl.go → coder-sdk/devurl.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package entclient
package coder

import (
"context"
Expand All @@ -24,7 +24,7 @@ type delDevURLRequest struct {
func (c Client) DelDevURL(ctx context.Context, envID, urlID string) error {
reqURL := fmt.Sprintf("/api/environments/%s/devurls/%s", envID, urlID)

res, err := c.request(ctx, "DELETE", reqURL, delDevURLRequest{
res, err := c.request(ctx, http.MethodDelete, reqURL, delDevURLRequest{
EnvID: envID,
DevURLID: urlID,
})
Expand All @@ -51,7 +51,7 @@ type createDevURLRequest struct {
func (c Client) InsertDevURL(ctx context.Context, envID string, port int, name, access string) error {
reqURL := fmt.Sprintf("/api/environments/%s/devurls", envID)

res, err := c.request(ctx, "POST", reqURL, createDevURLRequest{
res, err := c.request(ctx, http.MethodPost, reqURL, createDevURLRequest{
EnvID: envID,
Port: port,
Access: access,
Expand All @@ -75,7 +75,7 @@ type updateDevURLRequest createDevURLRequest
func (c Client) UpdateDevURL(ctx context.Context, envID, urlID string, port int, name, access string) error {
reqURL := fmt.Sprintf("/api/environments/%s/devurls/%s", envID, urlID)

res, err := c.request(ctx, "PUT", reqURL, updateDevURLRequest{
res, err := c.request(ctx, http.MethodPut, reqURL, updateDevURLRequest{
EnvID: envID,
Port: port,
Access: access,
Expand Down
11 changes: 6 additions & 5 deletions internal/entclient/env.go → coder-sdk/env.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package entclient
package coder

import (
"context"
"net/http"
"time"

"cdr.dev/coder-cli/internal/x/xjson"
Expand Down Expand Up @@ -33,12 +34,12 @@ type Environment struct {
AutoOffThreshold xjson.Duration `json:"auto_off_threshold" tab:"-"`
}

// Envs gets the list of environments owned by the authenticated user
func (c Client) Envs(ctx context.Context, user *User, org Org) ([]Environment, error) {
// EnvironmentsByOrganization gets the list of environments owned by the given user.
func (c Client) EnvironmentsByOrganization(ctx context.Context, userID, orgID string) ([]Environment, error) {
var envs []Environment
err := c.requestBody(
ctx,
"GET", "/api/orgs/"+org.ID+"/members/"+user.ID+"/environments",
http.MethodGet, "/api/orgs/"+orgID+"/members/"+userID+"/environments",
nil,
&envs,
)
Expand All @@ -47,7 +48,7 @@ func (c Client) Envs(ctx context.Context, user *User, org Org) ([]Environment, e

// DialWsep dials an environments command execution interface
// See github.com/cdr/wsep for details
func (c Client) DialWsep(ctx context.Context, env Environment) (*websocket.Conn, error) {
func (c Client) DialWsep(ctx context.Context, env *Environment) (*websocket.Conn, error) {
u := c.copyURL()
if c.BaseURL.Scheme == "https" {
u.Scheme = "wss"
Expand Down
2 changes: 1 addition & 1 deletion internal/entclient/error.go → coder-sdk/error.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package entclient
package coder

import (
"encoding/json"
Expand Down
9 changes: 6 additions & 3 deletions internal/entclient/org.go → coder-sdk/org.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package entclient
package coder

import "context"
import (
"context"
"net/http"
)

// Org describes an Organization in Coder
type Org struct {
Expand All @@ -12,6 +15,6 @@ type Org struct {
// Orgs gets all Organizations
func (c Client) Orgs(ctx context.Context) ([]Org, error) {
var os []Org
err := c.requestBody(ctx, "GET", "/api/orgs", nil, &os)
err := c.requestBody(ctx, http.MethodGet, "/api/orgs", nil, &os)
return os, err
}
2 changes: 1 addition & 1 deletion internal/entclient/request.go → coder-sdk/request.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package entclient
package coder

import (
"bytes"
Expand Down
79 changes: 79 additions & 0 deletions coder-sdk/secrets.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package coder

import (
"context"
"net/http"
"time"
)

// Secret describes a Coder secret
type Secret struct {
ID string `json:"id" tab:"-"`
Name string `json:"name"`
Value string `json:"value,omitempty"`
Description string `json:"description"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at" tab:"-"`
}

// Secrets gets all secrets for the given user
func (c *Client) Secrets(ctx context.Context, userID string) ([]Secret, error) {
var secrets []Secret
err := c.requestBody(ctx, http.MethodGet, "/api/users/"+userID+"/secrets", nil, &secrets)
return secrets, err
}

// SecretWithValueByName gets the Coder secret with its value by its name.
func (c *Client) SecretWithValueByName(ctx context.Context, name, userID string) (*Secret, error) {
s, err := c.SecretByName(ctx, name, userID)
if err != nil {
return nil, err
}
var secret Secret
err = c.requestBody(ctx, http.MethodGet, "/api/users/"+userID+"/secrets/"+s.ID, nil, &secret)
return &secret, err
}

// SecretWithValueByID gets the Coder secret with its value by the secret_id.
func (c *Client) SecretWithValueByID(ctx context.Context, id, userID string) (*Secret, error) {
var secret Secret
err := c.requestBody(ctx, http.MethodGet, "/api/users/"+userID+"/secrets/"+id, nil, &secret)
return &secret, err
}

// SecretByName gets a secret object by name
func (c *Client) SecretByName(ctx context.Context, name, userID string) (*Secret, error) {
secrets, err := c.Secrets(ctx, userID)
if err != nil {
return nil, err
}
for _, s := range secrets {
if s.Name == name {
return &s, nil
}
}
return nil, ErrNotFound
}

// InsertSecretReq describes the request body for creating a new secret
type InsertSecretReq struct {
Name string `json:"name"`
Value string `json:"value"`
Description string `json:"description"`
}

// InsertSecret adds a new secret for the authed user
func (c *Client) InsertSecret(ctx context.Context, user *User, req InsertSecretReq) error {
var resp interface{}
return c.requestBody(ctx, http.MethodPost, "/api/users/"+user.ID+"/secrets", req, &resp)
}

// DeleteSecretByName deletes the authenticated users secret with the given name
func (c *Client) DeleteSecretByName(ctx context.Context, name, userID string) error {
secret, err := c.SecretByName(ctx, name, userID)
if err != nil {
return err
}
_, err = c.request(ctx, http.MethodDelete, "/api/users/"+userID+"/secrets/"+secret.ID, nil)
return err
}
75 changes: 75 additions & 0 deletions coder-sdk/users.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package coder

import (
"context"
"net/http"
"time"
)

// User describes a Coder user account.
type User struct {
ID string `json:"id" tab:"-"`
Email string `json:"email"`
Username string `json:"username"`
Name string `json:"name"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at" tab:"-"`
}

// Me gets the details of the authenticated user.
func (c Client) Me(ctx context.Context) (*User, error) {
return c.UserByID(ctx, Me)
}

// UserByID get the details of a user by their id.
func (c Client) UserByID(ctx context.Context, id string) (*User, error) {
var u User
err := c.requestBody(ctx, http.MethodGet, "/api/users/"+id, nil, &u)
if err != nil {
return nil, err
}
return &u, nil
}

// SSHKey describes an SSH keypair
type SSHKey struct {
PublicKey string `json:"public_key"`
PrivateKey string `json:"private_key"`
}

// SSHKey gets the current SSH kepair of the authenticated user.
func (c Client) SSHKey(ctx context.Context) (*SSHKey, error) {
var key SSHKey
err := c.requestBody(ctx, http.MethodGet, "/api/users/me/sshkey", nil, &key)
if err != nil {
return nil, err
}
return &key, nil
}

// Users gets the list of user accounts.
func (c Client) Users(ctx context.Context) ([]User, error) {
var u []User
err := c.requestBody(ctx, http.MethodGet, "/api/users", nil, &u)
if err != nil {
return nil, err
}
return u, nil
}

// UserByEmail gets a user by email.
func (c Client) UserByEmail(ctx context.Context, email string) (*User, error) {
if email == Me {
return c.Me(ctx)
}
users, err := c.Users(ctx)
if err != nil {
return nil, err
}
for _, u := range users {
if u.Email == email {
return &u, nil
}
}
return nil, ErrNotFound
}
6 changes: 3 additions & 3 deletions internal/activity/pusher.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import (
"context"
"time"

"cdr.dev/coder-cli/internal/entclient"
"cdr.dev/coder-cli/coder-sdk"
"golang.org/x/time/rate"

"go.coder.com/flog"
Expand All @@ -18,12 +18,12 @@ type Pusher struct {
envID string
source string

client *entclient.Client
client *coder.Client
rate *rate.Limiter
}

// NewPusher instantiates a new instance of Pusher
func NewPusher(c *entclient.Client, envID, source string) *Pusher {
func NewPusher(c *coder.Client, envID, source string) *Pusher {
return &Pusher{
envID: envID,
source: source,
Expand Down
8 changes: 4 additions & 4 deletions internal/cmd/auth.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,23 @@ package cmd
import (
"net/url"

"cdr.dev/coder-cli/coder-sdk"
"cdr.dev/coder-cli/internal/config"
"cdr.dev/coder-cli/internal/entclient"
"golang.org/x/xerrors"

"go.coder.com/flog"
)

// requireAuth exits the process with a nonzero exit code if the user is not authenticated to make requests
func requireAuth() *entclient.Client {
func requireAuth() *coder.Client {
client, err := newClient()
if err != nil {
flog.Fatal("%v", err)
}
return client
}

func newClient() (*entclient.Client, error) {
func newClient() (*coder.Client, error) {
sessionToken, err := config.Session.Read()
if err != nil {
return nil, xerrors.Errorf("read session: %v (did you run coder login?)", err)
Expand All @@ -35,7 +35,7 @@ func newClient() (*entclient.Client, error) {
return nil, xerrors.Errorf("url misformatted: %v (try runing coder login)", err)
}

client := &entclient.Client{
client := &coder.Client{
BaseURL: u,
Token: sessionToken,
}
Expand Down
Loading