forked from openshift/origin
-
Notifications
You must be signed in to change notification settings - Fork 0
/
catalog.go
156 lines (138 loc) · 5.34 KB
/
catalog.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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
package servicebroker
import (
"net/http"
"strings"
"k8s.io/apimachinery/pkg/labels"
"github.com/golang/glog"
jsschema "github.com/lestrrat/go-jsschema"
oapi "github.com/openshift/origin/pkg/api"
templateapi "github.com/openshift/origin/pkg/template/apis/template"
"github.com/openshift/origin/pkg/templateservicebroker/openservicebroker/api"
)
const (
//TODO - when https://github.com/kubernetes-incubator/service-catalog/pull/939 sufficiently progresses, this block should be removed
requesterUsernameTitle = "Template service broker: requester username"
requesterUsernameDescription = "OpenShift user requesting provision/bind"
noDescriptionProvided = "No description provided."
)
// Map OpenShift template annotations to open service broker metadata field
// community standards.
var annotationMap = map[string]string{
oapi.OpenShiftDisplayName: api.ServiceMetadataDisplayName,
templateapi.IconClassAnnotation: templateapi.ServiceMetadataIconClass,
templateapi.LongDescriptionAnnotation: api.ServiceMetadataLongDescription,
templateapi.ProviderDisplayNameAnnotation: api.ServiceMetadataProviderDisplayName,
templateapi.DocumentationURLAnnotation: api.ServiceMetadataDocumentationURL,
templateapi.SupportURLAnnotation: api.ServiceMetadataSupportURL,
}
// serviceFromTemplate populates an open service broker service response from
// an OpenShift template.
func serviceFromTemplate(template *templateapi.Template) *api.Service {
metadata := make(map[string]interface{})
for srcname, dstname := range annotationMap {
if value, ok := template.Annotations[srcname]; ok {
metadata[dstname] = value
}
}
//TODO - when https://github.com/kubernetes-incubator/service-catalog/pull/939 sufficiently progresses, this block should be replaced
// with the commented out block immediately following it ... note we no longer require the param, in case the new approach is used
properties := map[string]*jsschema.Schema{
templateapi.RequesterUsernameParameterKey: {
Title: requesterUsernameTitle,
Description: requesterUsernameDescription,
Type: []jsschema.PrimitiveType{jsschema.StringType},
},
}
//properties := map[string]*jsschema.Schema{}
paramOrdering := []string{}
required := []string{}
for _, param := range template.Parameters {
properties[param.Name] = &jsschema.Schema{
Title: param.DisplayName,
Description: param.Description,
Default: param.Value,
Type: []jsschema.PrimitiveType{jsschema.StringType},
}
if param.Required && param.Generate == "" {
required = append(required, param.Name)
}
paramOrdering = append(paramOrdering, param.Name)
}
//TODO - when https://github.com/kubernetes-incubator/service-catalog/pull/939 sufficiently progresses, this block should be removed
paramOrdering = append(paramOrdering, templateapi.RequesterUsernameParameterKey)
plan := api.Plan{
ID: string(template.UID), // TODO: this should be a unique value
Name: "default",
Description: "Default plan",
Free: true,
Bindable: true,
Schemas: api.Schema{
ServiceInstance: api.ServiceInstances{
Create: map[string]*jsschema.Schema{
"parameters": {
SchemaRef: jsschema.SchemaURL,
Type: []jsschema.PrimitiveType{jsschema.ObjectType},
Properties: properties,
Required: required,
},
},
},
ServiceBinding: api.ServiceBindings{
Create: map[string]*jsschema.Schema{
"parameters": {
SchemaRef: jsschema.SchemaURL,
Type: []jsschema.PrimitiveType{jsschema.ObjectType},
Properties: map[string]*jsschema.Schema{
//TODO - when https://github.com/kubernetes-incubator/service-catalog/pull/939 sufficiently progresses, remove this prop
templateapi.RequesterUsernameParameterKey: {
Title: requesterUsernameTitle,
Description: requesterUsernameDescription,
Type: []jsschema.PrimitiveType{jsschema.StringType},
},
},
Required: []string{},
},
},
},
},
}
// This metadata ensures the template parameters are displayed in the
// service catalog in the same order as they are defined in the template.
plan.Metadata = make(map[string]interface{})
plan.Metadata["schemas"] = api.ParameterSchemas{
ServiceInstance: api.ParameterSchema{
Create: api.OpenShiftMetadata{
OpenShiftFormDefinition: paramOrdering,
},
},
}
description := template.Annotations["description"]
if description == "" {
description = noDescriptionProvided
}
return &api.Service{
Name: template.Name,
ID: string(template.UID),
Description: description,
Tags: strings.Split(template.Annotations["tags"], ","),
Bindable: true,
Metadata: metadata,
Plans: []api.Plan{plan},
}
}
// Catalog returns our service catalog (one service per OpenShift template in
// configured namespace(s)).
func (b *Broker) Catalog() *api.Response {
glog.V(4).Infof("Template service broker: Catalog")
var services []*api.Service
for namespace := range b.templateNamespaces {
templates, err := b.lister.Templates(namespace).List(labels.Everything())
if err != nil {
return api.InternalServerError(err)
}
for _, template := range templates {
services = append(services, serviceFromTemplate(template))
}
}
return api.NewResponse(http.StatusOK, &api.CatalogResponse{Services: services}, nil)
}