apihandler.go 7.0 KB
Newer Older
B
bryk 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
// Copyright 2015 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package main

import (
	"net/http"

	restful "github.com/emicklei/go-restful"
B
bryk 已提交
21
	client "k8s.io/kubernetes/pkg/client/unversioned"
22
	"strconv"
B
bryk 已提交
23 24 25
)

// Creates a new HTTP handler that handles all requests to the API of the backend.
26 27
func CreateHttpApiHandler(client *client.Client) http.Handler {
	apiHandler := ApiHandler{client}
B
bryk 已提交
28 29
	wsContainer := restful.NewContainer()

30
	deployWs := new(restful.WebService)
B
bryk 已提交
31
	deployWs.Path("/api/appdeployments").
B
bryk 已提交
32 33
		Consumes(restful.MIME_JSON).
		Produces(restful.MIME_JSON)
34 35 36
	deployWs.Route(
		deployWs.POST("").
			To(apiHandler.handleDeploy).
37 38
			Reads(AppDeploymentSpec{}).
			Writes(AppDeploymentSpec{}))
39 40
	wsContainer.Add(deployWs)

41 42
	replicaSetWs := new(restful.WebService)
	replicaSetWs.Path("/api/replicasets").
43
		Produces(restful.MIME_JSON)
44 45
	replicaSetWs.Route(
		replicaSetWs.GET("").
46 47
			To(apiHandler.handleGetReplicaSetList).
			Writes(ReplicaSetList{}))
48 49 50 51
	replicaSetWs.Route(
		replicaSetWs.GET("/{namespace}/{replicaSet}").
			To(apiHandler.handleGetReplicaSetDetail).
			Writes(ReplicaSetDetail{}))
52 53 54
	replicaSetWs.Route(
		replicaSetWs.DELETE("/{namespace}/{replicaSet}").
			To(apiHandler.handleDeleteReplicaSet))
55 56 57 58
	replicaSetWs.Route(
		replicaSetWs.GET("/pods/{namespace}/{replicaSet}").
			To(apiHandler.handleGetReplicaSetPods).
			Writes(ReplicaSetPods{}))
59
	wsContainer.Add(replicaSetWs)
B
bryk 已提交
60

61 62 63
	namespacesWs := new(restful.WebService)
	namespacesWs.Path("/api/namespaces").
		Consumes(restful.MIME_JSON).
64
		Produces(restful.MIME_JSON)
65 66 67 68 69 70 71 72
	namespacesWs.Route(
		namespacesWs.POST("").
			To(apiHandler.handleCreateNamespace).
			Reads(NamespaceSpec{}).
			Writes(NamespaceSpec{}))
	namespacesWs.Route(
		namespacesWs.GET("").
			To(apiHandler.handleGetNamespaces).
73
			Writes(NamespaceList{}))
74
	wsContainer.Add(namespacesWs)
75

L
Lukasz Zajaczkowski 已提交
76 77 78 79
	logsWs := new(restful.WebService)
	logsWs.Path("/api/logs").
		Produces(restful.MIME_JSON)
	logsWs.Route(
80
		logsWs.GET("/{namespace}/{podId}/{container}").
L
Lukasz Zajaczkowski 已提交
81 82 83 84
			To(apiHandler.handleLogs).
			Writes(Logs{}))
	wsContainer.Add(logsWs)

85 86 87 88
	eventsWs := new(restful.WebService)
	eventsWs.Path("/api/events").
		Produces(restful.MIME_JSON)
	eventsWs.Route(
89
		eventsWs.GET("/{namespace}/{replicaSet}").
90 91 92 93
			To(apiHandler.handleEvents).
			Writes(Events{}))
	wsContainer.Add(eventsWs)

B
bryk 已提交
94 95
	return wsContainer
}
B
bryk 已提交
96

97 98 99 100 101 102
type ApiHandler struct {
	client *client.Client
}

// Handles deploy API call.
func (apiHandler *ApiHandler) handleDeploy(request *restful.Request, response *restful.Response) {
103 104
	appDeploymentSpec := new(AppDeploymentSpec)
	if err := request.ReadEntity(appDeploymentSpec); err != nil {
105 106 107
		handleInternalError(response, err)
		return
	}
108
	if err := DeployApp(appDeploymentSpec, apiHandler.client); err != nil {
109 110 111 112
		handleInternalError(response, err)
		return
	}

113
	response.WriteHeaderAndEntity(http.StatusCreated, appDeploymentSpec)
114 115
}

116 117
// Handles get Replica Set list API call.
func (apiHandler *ApiHandler) handleGetReplicaSetList(
118 119
	request *restful.Request, response *restful.Response) {

120
	result, err := GetReplicaSetList(apiHandler.client)
121 122 123 124 125 126 127 128
	if err != nil {
		handleInternalError(response, err)
		return
	}

	response.WriteHeaderAndEntity(http.StatusCreated, result)
}

129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
// Handles get Replica Set detail API call.
func (apiHandler *ApiHandler) handleGetReplicaSetDetail(
	request *restful.Request, response *restful.Response) {

	namespace := request.PathParameter("namespace")
	replicaSet := request.PathParameter("replicaSet")
	result, err := GetReplicaSetDetail(apiHandler.client, namespace, replicaSet)
	if err != nil {
		handleInternalError(response, err)
		return
	}

	response.WriteHeaderAndEntity(http.StatusCreated, result)
}

144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
// Handles delete Replica Set API call.
func (apiHandler *ApiHandler) handleDeleteReplicaSet(
	request *restful.Request, response *restful.Response) {

	namespace := request.PathParameter("namespace")
	replicaSet := request.PathParameter("replicaSet")

	if err := DeleteReplicaSetWithPods(apiHandler.client, namespace, replicaSet); err != nil {
		handleInternalError(response, err)
		return
	}

	response.WriteHeader(http.StatusOK)
}

159 160 161 162 163 164
// Handles get Replica Set Pods API call.
func (apiHandler *ApiHandler) handleGetReplicaSetPods(
	request *restful.Request, response *restful.Response) {

	namespace := request.PathParameter("namespace")
	replicaSet := request.PathParameter("replicaSet")
165 166 167 168 169
	limit, err := strconv.Atoi(request.QueryParameter("limit"))
	if err != nil {
		limit = 0
	}
	result, err := GetReplicaSetPods(apiHandler.client, namespace, replicaSet, limit)
170 171 172 173 174 175 176 177
	if err != nil {
		handleInternalError(response, err)
		return
	}

	response.WriteHeaderAndEntity(http.StatusCreated, result)
}

178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
// Handles namespace creation API call.
func (apiHandler *ApiHandler) handleCreateNamespace(request *restful.Request,
	response *restful.Response) {
	namespaceSpec := new(NamespaceSpec)
	if err := request.ReadEntity(namespaceSpec); err != nil {
		handleInternalError(response, err)
		return
	}
	if err := CreateNamespace(namespaceSpec, apiHandler.client); err != nil {
		handleInternalError(response, err)
		return
	}

	response.WriteHeaderAndEntity(http.StatusCreated, namespaceSpec)
}

194
// Handles get namespace list API call.
195
func (apiHandler *ApiHandler) handleGetNamespaces(
196 197 198 199 200 201 202 203 204 205 206
	request *restful.Request, response *restful.Response) {

	result, err := GetNamespaceList(apiHandler.client)
	if err != nil {
		handleInternalError(response, err)
		return
	}

	response.WriteHeaderAndEntity(http.StatusCreated, result)
}

L
Lukasz Zajaczkowski 已提交
207 208 209 210
// Handles log API call.
func (apiHandler *ApiHandler) handleLogs(request *restful.Request, response *restful.Response) {
	namespace := request.PathParameter("namespace")
	podId := request.PathParameter("podId")
211 212
	container := request.PathParameter("container")
	result, err := GetPodLogs(apiHandler.client, namespace, podId, container)
L
Lukasz Zajaczkowski 已提交
213 214 215 216 217 218 219
	if err != nil {
		handleInternalError(response, err)
		return
	}
	response.WriteHeaderAndEntity(http.StatusCreated, result)
}

220 221 222
// Handles event API call.
func (apiHandler *ApiHandler) handleEvents(request *restful.Request, response *restful.Response) {
	namespace := request.PathParameter("namespace")
223 224
	replicaSet := request.PathParameter("replicaSet")
	result, err := GetEvents(apiHandler.client, namespace, replicaSet)
225 226 227 228 229 230 231
	if err != nil {
		handleInternalError(response, err)
		return
	}
	response.WriteHeaderAndEntity(http.StatusCreated, result)
}

B
bryk 已提交
232
// Handler that writes the given error to the response and sets appropriate HTTP status headers.
233
func handleInternalError(response *restful.Response, err error) {
B
bryk 已提交
234 235 236
	response.AddHeader("Content-Type", "text/plain")
	response.WriteErrorString(http.StatusInternalServerError, err.Error()+"\n")
}