forked from fabric8-services/fabric8-wit
-
Notifications
You must be signed in to change notification settings - Fork 0
/
init_tenant.go
140 lines (115 loc) · 3.5 KB
/
init_tenant.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package account
import (
"fmt"
"net/http"
"context"
"net/url"
"github.com/fabric8-services/fabric8-wit/account/tenant"
"github.com/fabric8-services/fabric8-wit/errors"
"github.com/fabric8-services/fabric8-wit/goasupport"
goaclient "github.com/goadesign/goa/client"
)
type tenantConfig interface {
GetTenantServiceURL() string
}
// NewInitTenant creates a new tenant service in oso
func NewInitTenant(config tenantConfig) func(context.Context) error {
return func(ctx context.Context) error {
return InitTenant(ctx, config)
}
}
// NewUpdateTenant creates a new tenant service in oso
func NewUpdateTenant(config tenantConfig) func(context.Context) error {
return func(ctx context.Context) error {
return UpdateTenant(ctx, config)
}
}
// NewCleanTenant creates a new tenant service in oso
func NewCleanTenant(config tenantConfig) func(context.Context) error {
return func(ctx context.Context) error {
return CleanTenant(ctx, config)
}
}
// NewShowTenant view an existing tenant in oso
func NewShowTenant(config tenantConfig) func(context.Context) (*tenant.TenantSingle, error) {
return func(ctx context.Context) (*tenant.TenantSingle, error) {
return ShowTenant(ctx, config)
}
}
// InitTenant creates a new tenant service in oso
func InitTenant(ctx context.Context, config tenantConfig) error {
c, err := createClient(ctx, config)
if err != nil {
return err
}
// Ignore response for now
_, err = c.SetupTenant(goasupport.ForwardContextRequestID(ctx), tenant.SetupTenantPath())
return err
}
// UpdateTenant updates excisting tenant in oso
func UpdateTenant(ctx context.Context, config tenantConfig) error {
c, err := createClient(ctx, config)
if err != nil {
return err
}
// Ignore response for now
_, err = c.UpdateTenant(goasupport.ForwardContextRequestID(ctx), tenant.UpdateTenantPath())
return err
}
// CleanTenant cleans out a tenant in oso.
func CleanTenant(ctx context.Context, config tenantConfig) error {
c, err := createClient(ctx, config)
if err != nil {
return err
}
res, err := c.CleanTenant(goasupport.ForwardContextRequestID(ctx), tenant.CleanTenantPath())
if err != nil {
return err
}
if res.StatusCode != http.StatusOK {
jsonErr, err := c.DecodeJSONAPIErrors(res)
if err == nil {
if len(jsonErr.Errors) > 0 {
return errors.NewInternalError(ctx, fmt.Errorf(jsonErr.Errors[0].Detail))
}
}
}
return nil
}
// ShowTenant fetches the current tenant state.
func ShowTenant(ctx context.Context, config tenantConfig) (*tenant.TenantSingle, error) {
c, err := createClient(ctx, config)
if err != nil {
return nil, err
}
res, err := c.ShowTenant(goasupport.ForwardContextRequestID(ctx), tenant.ShowTenantPath())
if err != nil {
return nil, err
}
if res.StatusCode == http.StatusOK {
tenant, err := c.DecodeTenantSingle(res)
if err != nil {
return nil, errors.NewInternalError(ctx, err)
}
return tenant, nil
} else if res.StatusCode > 400 {
jsonErr, err := c.DecodeJSONAPIErrors(res)
if err == nil {
if len(jsonErr.Errors) > 0 {
return nil, errors.NewInternalError(ctx, fmt.Errorf(jsonErr.Errors[0].Detail))
}
}
}
return nil, errors.NewInternalError(ctx, fmt.Errorf("Unknown response "+res.Status))
}
func createClient(ctx context.Context, config tenantConfig) (*tenant.Client, error) {
u, err := url.Parse(config.GetTenantServiceURL())
if err != nil {
return nil, err
}
c := tenant.New(goaclient.HTTPClientDoer(http.DefaultClient))
c.Host = u.Host
c.Scheme = u.Scheme
c.SetJWTSigner(goasupport.NewForwardSigner(ctx))
return c, nil
}