forked from openshift/origin
-
Notifications
You must be signed in to change notification settings - Fork 1
/
catalog.go
125 lines (112 loc) · 3.93 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
package servicebroker
import (
"net/http"
"strings"
jsschema "github.com/lestrrat/go-jsschema"
oapi "github.com/openshift/origin/pkg/api"
"github.com/openshift/origin/pkg/openservicebroker/api"
templateapi "github.com/openshift/origin/pkg/template/api"
)
const (
namespaceTitle = "Template service broker: namespace"
namespaceDescription = "OpenShift namespace in which to provision service"
requesterUsernameTitle = "Template service broker: requester username"
requesterUsernameDescription = "OpenShift user requesting provision/bind"
)
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,
}
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
}
}
properties := map[string]*jsschema.Schema{
templateapi.NamespaceParameterKey: {
Title: namespaceTitle,
Description: namespaceDescription,
Type: []jsschema.PrimitiveType{jsschema.StringType},
},
templateapi.RequesterUsernameParameterKey: {
Title: requesterUsernameTitle,
Description: requesterUsernameDescription,
Type: []jsschema.PrimitiveType{jsschema.StringType},
},
}
required := []string{templateapi.NamespaceParameterKey, templateapi.RequesterUsernameParameterKey}
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 {
required = append(required, param.Name)
}
}
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{
ServiceInstances: api.ServiceInstances{
Create: map[string]*jsschema.Schema{
"parameters": {
SchemaRef: jsschema.SchemaURL,
Type: []jsschema.PrimitiveType{jsschema.ObjectType},
Properties: properties,
Required: required,
},
},
},
ServiceBindings: api.ServiceBindings{
Create: map[string]*jsschema.Schema{
"parameters": {
SchemaRef: jsschema.SchemaURL,
Type: []jsschema.PrimitiveType{jsschema.ObjectType},
Properties: map[string]*jsschema.Schema{
templateapi.RequesterUsernameParameterKey: {
Title: requesterUsernameTitle,
Description: requesterUsernameDescription,
Type: []jsschema.PrimitiveType{jsschema.StringType},
},
},
Required: []string{templateapi.RequesterUsernameParameterKey},
},
},
},
},
}
return &api.Service{
Name: template.Name,
ID: string(template.UID),
Description: template.Annotations["description"],
Tags: strings.Split(template.Annotations["tags"], ","),
Bindable: true,
Metadata: metadata,
Plans: []api.Plan{plan},
}
}
func (b *Broker) Catalog() *api.Response {
var services []*api.Service
for namespace := range b.templateNamespaces {
templates, err := b.lister.ListByNamespace(namespace)
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)
}