apihandler.go 4.4 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"
B
bryk 已提交
22 23 24
)

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

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

40 41
	replicaSetWs := new(restful.WebService)
	replicaSetWs.Path("/api/replicasets").
42
		Produces(restful.MIME_JSON)
43 44
	replicaSetWs.Route(
		replicaSetWs.GET("").
45 46
			To(apiHandler.handleGetReplicaSetList).
			Writes(ReplicaSetList{}))
47 48 49 50 51
	replicaSetWs.Route(
		replicaSetWs.GET("/{namespace}/{replicaSet}").
			To(apiHandler.handleGetReplicaSetDetail).
			Writes(ReplicaSetDetail{}))
	wsContainer.Add(replicaSetWs)
B
bryk 已提交
52

53
	namespaceListWs := new(restful.WebService)
B
bryk 已提交
54
	namespaceListWs.Path("/api/namespaces").
55 56 57 58 59 60 61
		Produces(restful.MIME_JSON)
	namespaceListWs.Route(
		namespaceListWs.GET("").
			To(apiHandler.handleGetNamespaceList).
			Writes(NamespacesList{}))
	wsContainer.Add(namespaceListWs)

L
Lukasz Zajaczkowski 已提交
62 63 64 65 66 67 68 69 70
	logsWs := new(restful.WebService)
	logsWs.Path("/api/logs").
		Produces(restful.MIME_JSON)
	logsWs.Route(
		logsWs.GET("/{namespace}/{podId}").
			To(apiHandler.handleLogs).
			Writes(Logs{}))
	wsContainer.Add(logsWs)

B
bryk 已提交
71 72
	return wsContainer
}
B
bryk 已提交
73

74 75 76 77 78 79
type ApiHandler struct {
	client *client.Client
}

// Handles deploy API call.
func (apiHandler *ApiHandler) handleDeploy(request *restful.Request, response *restful.Response) {
80
	cfg := new(AppDeployment)
81 82 83 84 85 86 87 88 89 90 91 92
	if err := request.ReadEntity(cfg); err != nil {
		handleInternalError(response, err)
		return
	}
	if err := DeployApp(cfg, apiHandler.client); err != nil {
		handleInternalError(response, err)
		return
	}

	response.WriteHeaderAndEntity(http.StatusCreated, cfg)
}

93 94
// Handles get Replica Set list API call.
func (apiHandler *ApiHandler) handleGetReplicaSetList(
95 96
	request *restful.Request, response *restful.Response) {

97
	result, err := GetReplicaSetList(apiHandler.client)
98 99 100 101 102 103 104 105
	if err != nil {
		handleInternalError(response, err)
		return
	}

	response.WriteHeaderAndEntity(http.StatusCreated, result)
}

106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
// 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)
}

121 122 123 124 125 126 127 128 129 130 131 132 133
// Handles get namespace list API call.
func (apiHandler *ApiHandler) handleGetNamespaceList(
	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 已提交
134 135 136 137 138 139 140 141 142 143 144 145 146
// Handles log API call.
func (apiHandler *ApiHandler) handleLogs(request *restful.Request, response *restful.Response) {

	namespace := request.PathParameter("namespace")
	podId := request.PathParameter("podId")
	result, err := GetPodLogs(apiHandler.client, namespace, podId)
	if err != nil {
		handleInternalError(response, err)
		return
	}
	response.WriteHeaderAndEntity(http.StatusCreated, result)
}

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