Commit a84fa79a authored by Cesar Wong's avatar Cesar Wong

Use versioned objects for GET and CONNECT operations

parent c5bffaaf
...@@ -5707,6 +5707,54 @@ ...@@ -5707,6 +5707,54 @@
"nickname": "connectGetNamespacedPodExec", "nickname": "connectGetNamespacedPodExec",
"parameters": [ "parameters": [
{ {
"type": "boolean",
"paramType": "query",
"name": "stdin",
"description": "redirect the standard input stream of the pod for this call; defaults to false",
"required": false,
"allowMultiple": false
},
{
"type": "boolean",
"paramType": "query",
"name": "stdout",
"description": "redirect the standard output stream of the pod for this call; defaults to true",
"required": false,
"allowMultiple": false
},
{
"type": "boolean",
"paramType": "query",
"name": "stderr",
"description": "redirect the standard error stream of the pod for this call; defaults to true",
"required": false,
"allowMultiple": false
},
{
"type": "boolean",
"paramType": "query",
"name": "tty",
"description": "allocate a terminal for this exec call; defaults to false",
"required": false,
"allowMultiple": false
},
{
"type": "string",
"paramType": "query",
"name": "container",
"description": "the container in which to execute the command. Defaults to only container if there is only one container in the pod.",
"required": false,
"allowMultiple": false
},
{
"type": "",
"paramType": "query",
"name": "command",
"description": "the command to execute; argv array; not executed within a shell",
"required": false,
"allowMultiple": false
},
{
"type": "string", "type": "string",
"paramType": "path", "paramType": "path",
"name": "namespace", "name": "namespace",
...@@ -5737,6 +5785,54 @@ ...@@ -5737,6 +5785,54 @@
"nickname": "connectPostNamespacedPodExec", "nickname": "connectPostNamespacedPodExec",
"parameters": [ "parameters": [
{ {
"type": "boolean",
"paramType": "query",
"name": "stdin",
"description": "redirect the standard input stream of the pod for this call; defaults to false",
"required": false,
"allowMultiple": false
},
{
"type": "boolean",
"paramType": "query",
"name": "stdout",
"description": "redirect the standard output stream of the pod for this call; defaults to true",
"required": false,
"allowMultiple": false
},
{
"type": "boolean",
"paramType": "query",
"name": "stderr",
"description": "redirect the standard error stream of the pod for this call; defaults to true",
"required": false,
"allowMultiple": false
},
{
"type": "boolean",
"paramType": "query",
"name": "tty",
"description": "allocate a terminal for this exec call; defaults to false",
"required": false,
"allowMultiple": false
},
{
"type": "string",
"paramType": "query",
"name": "container",
"description": "the container in which to execute the command. Defaults to only container if there is only one container in the pod.",
"required": false,
"allowMultiple": false
},
{
"type": "",
"paramType": "query",
"name": "command",
"description": "the command to execute; argv array; not executed within a shell",
"required": false,
"allowMultiple": false
},
{
"type": "string", "type": "string",
"paramType": "path", "paramType": "path",
"name": "namespace", "name": "namespace",
...@@ -5782,6 +5878,30 @@ ...@@ -5782,6 +5878,30 @@
}, },
{ {
"type": "string", "type": "string",
"paramType": "query",
"name": "container",
"description": "the container for which to stream logs; defaults to only container if there is one container in the pod",
"required": false,
"allowMultiple": false
},
{
"type": "boolean",
"paramType": "query",
"name": "follow",
"description": "follow the log stream of the pod; defaults to false",
"required": false,
"allowMultiple": false
},
{
"type": "boolean",
"paramType": "query",
"name": "previous",
"description": "return previous terminated container logs; defaults to false",
"required": false,
"allowMultiple": false
},
{
"type": "string",
"paramType": "path", "paramType": "path",
"name": "namespace", "name": "namespace",
"description": "object name and auth scope, such as for teams and projects", "description": "object name and auth scope, such as for teams and projects",
...@@ -5891,6 +6011,14 @@ ...@@ -5891,6 +6011,14 @@
"parameters": [ "parameters": [
{ {
"type": "string", "type": "string",
"paramType": "query",
"name": "path",
"description": "URL path to use in proxy request to pod",
"required": false,
"allowMultiple": false
},
{
"type": "string",
"paramType": "path", "paramType": "path",
"name": "namespace", "name": "namespace",
"description": "object name and auth scope, such as for teams and projects", "description": "object name and auth scope, such as for teams and projects",
...@@ -5921,6 +6049,14 @@ ...@@ -5921,6 +6049,14 @@
"parameters": [ "parameters": [
{ {
"type": "string", "type": "string",
"paramType": "query",
"name": "path",
"description": "URL path to use in proxy request to pod",
"required": false,
"allowMultiple": false
},
{
"type": "string",
"paramType": "path", "paramType": "path",
"name": "namespace", "name": "namespace",
"description": "object name and auth scope, such as for teams and projects", "description": "object name and auth scope, such as for teams and projects",
...@@ -5951,6 +6087,14 @@ ...@@ -5951,6 +6087,14 @@
"parameters": [ "parameters": [
{ {
"type": "string", "type": "string",
"paramType": "query",
"name": "path",
"description": "URL path to use in proxy request to pod",
"required": false,
"allowMultiple": false
},
{
"type": "string",
"paramType": "path", "paramType": "path",
"name": "namespace", "name": "namespace",
"description": "object name and auth scope, such as for teams and projects", "description": "object name and auth scope, such as for teams and projects",
...@@ -5981,6 +6125,14 @@ ...@@ -5981,6 +6125,14 @@
"parameters": [ "parameters": [
{ {
"type": "string", "type": "string",
"paramType": "query",
"name": "path",
"description": "URL path to use in proxy request to pod",
"required": false,
"allowMultiple": false
},
{
"type": "string",
"paramType": "path", "paramType": "path",
"name": "namespace", "name": "namespace",
"description": "object name and auth scope, such as for teams and projects", "description": "object name and auth scope, such as for teams and projects",
...@@ -6011,6 +6163,14 @@ ...@@ -6011,6 +6163,14 @@
"parameters": [ "parameters": [
{ {
"type": "string", "type": "string",
"paramType": "query",
"name": "path",
"description": "URL path to use in proxy request to pod",
"required": false,
"allowMultiple": false
},
{
"type": "string",
"paramType": "path", "paramType": "path",
"name": "namespace", "name": "namespace",
"description": "object name and auth scope, such as for teams and projects", "description": "object name and auth scope, such as for teams and projects",
...@@ -6041,6 +6201,14 @@ ...@@ -6041,6 +6201,14 @@
"parameters": [ "parameters": [
{ {
"type": "string", "type": "string",
"paramType": "query",
"name": "path",
"description": "URL path to use in proxy request to pod",
"required": false,
"allowMultiple": false
},
{
"type": "string",
"paramType": "path", "paramType": "path",
"name": "namespace", "name": "namespace",
"description": "object name and auth scope, such as for teams and projects", "description": "object name and auth scope, such as for teams and projects",
...@@ -6077,6 +6245,14 @@ ...@@ -6077,6 +6245,14 @@
"parameters": [ "parameters": [
{ {
"type": "string", "type": "string",
"paramType": "query",
"name": "path",
"description": "URL path to use in proxy request to pod",
"required": false,
"allowMultiple": false
},
{
"type": "string",
"paramType": "path", "paramType": "path",
"name": "namespace", "name": "namespace",
"description": "object name and auth scope, such as for teams and projects", "description": "object name and auth scope, such as for teams and projects",
...@@ -6115,6 +6291,14 @@ ...@@ -6115,6 +6291,14 @@
"parameters": [ "parameters": [
{ {
"type": "string", "type": "string",
"paramType": "query",
"name": "path",
"description": "URL path to use in proxy request to pod",
"required": false,
"allowMultiple": false
},
{
"type": "string",
"paramType": "path", "paramType": "path",
"name": "namespace", "name": "namespace",
"description": "object name and auth scope, such as for teams and projects", "description": "object name and auth scope, such as for teams and projects",
...@@ -6153,6 +6337,14 @@ ...@@ -6153,6 +6337,14 @@
"parameters": [ "parameters": [
{ {
"type": "string", "type": "string",
"paramType": "query",
"name": "path",
"description": "URL path to use in proxy request to pod",
"required": false,
"allowMultiple": false
},
{
"type": "string",
"paramType": "path", "paramType": "path",
"name": "namespace", "name": "namespace",
"description": "object name and auth scope, such as for teams and projects", "description": "object name and auth scope, such as for teams and projects",
...@@ -6191,6 +6383,14 @@ ...@@ -6191,6 +6383,14 @@
"parameters": [ "parameters": [
{ {
"type": "string", "type": "string",
"paramType": "query",
"name": "path",
"description": "URL path to use in proxy request to pod",
"required": false,
"allowMultiple": false
},
{
"type": "string",
"paramType": "path", "paramType": "path",
"name": "namespace", "name": "namespace",
"description": "object name and auth scope, such as for teams and projects", "description": "object name and auth scope, such as for teams and projects",
...@@ -6229,6 +6429,14 @@ ...@@ -6229,6 +6429,14 @@
"parameters": [ "parameters": [
{ {
"type": "string", "type": "string",
"paramType": "query",
"name": "path",
"description": "URL path to use in proxy request to pod",
"required": false,
"allowMultiple": false
},
{
"type": "string",
"paramType": "path", "paramType": "path",
"name": "namespace", "name": "namespace",
"description": "object name and auth scope, such as for teams and projects", "description": "object name and auth scope, such as for teams and projects",
...@@ -6267,6 +6475,14 @@ ...@@ -6267,6 +6475,14 @@
"parameters": [ "parameters": [
{ {
"type": "string", "type": "string",
"paramType": "query",
"name": "path",
"description": "URL path to use in proxy request to pod",
"required": false,
"allowMultiple": false
},
{
"type": "string",
"paramType": "path", "paramType": "path",
"name": "namespace", "name": "namespace",
"description": "object name and auth scope, such as for teams and projects", "description": "object name and auth scope, such as for teams and projects",
......
...@@ -204,10 +204,11 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag ...@@ -204,10 +204,11 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag
} }
versionedStatus := indirectArbitraryPointer(versionedStatusPtr) versionedStatus := indirectArbitraryPointer(versionedStatusPtr)
var ( var (
getOptions runtime.Object getOptions runtime.Object
getOptionsKind string versionedGetOptions runtime.Object
getSubpath bool getOptionsKind string
getSubpathKey string getSubpath bool
getSubpathKey string
) )
if isGetterWithOptions { if isGetterWithOptions {
getOptions, getSubpath, getSubpathKey = getterWithOptions.NewGetOptions() getOptions, getSubpath, getSubpathKey = getterWithOptions.NewGetOptions()
...@@ -215,14 +216,19 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag ...@@ -215,14 +216,19 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag
if err != nil { if err != nil {
return err return err
} }
versionedGetOptions, err = a.group.Creater.New(serverVersion, getOptionsKind)
if err != nil {
return err
}
isGetter = true isGetter = true
} }
var ( var (
connectOptions runtime.Object connectOptions runtime.Object
connectOptionsKind string versionedConnectOptions runtime.Object
connectSubpath bool connectOptionsKind string
connectSubpathKey string connectSubpath bool
connectSubpathKey string
) )
if isConnecter { if isConnecter {
connectOptions, connectSubpath, connectSubpathKey = connecter.NewConnectOptions() connectOptions, connectSubpath, connectSubpathKey = connecter.NewConnectOptions()
...@@ -231,6 +237,7 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag ...@@ -231,6 +237,7 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag
if err != nil { if err != nil {
return err return err
} }
versionedConnectOptions, err = a.group.Creater.New(serverVersion, connectOptionsKind)
} }
} }
...@@ -390,7 +397,7 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag ...@@ -390,7 +397,7 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag
Returns(http.StatusOK, "OK", versionedObject). Returns(http.StatusOK, "OK", versionedObject).
Writes(versionedObject) Writes(versionedObject)
if isGetterWithOptions { if isGetterWithOptions {
if err := addObjectParams(ws, route, getOptions); err != nil { if err := addObjectParams(ws, route, versionedGetOptions); err != nil {
return err return err
} }
} }
...@@ -561,8 +568,8 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag ...@@ -561,8 +568,8 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag
Produces("*/*"). Produces("*/*").
Consumes("*/*"). Consumes("*/*").
Writes("string") Writes("string")
if connectOptions != nil { if versionedConnectOptions != nil {
if err := addObjectParams(ws, route, connectOptions); err != nil { if err := addObjectParams(ws, route, versionedConnectOptions); err != nil {
return err return err
} }
} }
......
...@@ -255,8 +255,8 @@ func (*SimpleRoot) IsAnAPIObject() {} ...@@ -255,8 +255,8 @@ func (*SimpleRoot) IsAnAPIObject() {}
type SimpleGetOptions struct { type SimpleGetOptions struct {
api.TypeMeta `json:",inline"` api.TypeMeta `json:",inline"`
Param1 string `json:"param1"` Param1 string `json:"param1" description:"description for param1"`
Param2 string `json:"param2"` Param2 string `json:"param2" description:"description for param2"`
Path string `json:"atAPath"` Path string `json:"atAPath"`
} }
...@@ -1078,6 +1078,47 @@ func TestGetBinary(t *testing.T) { ...@@ -1078,6 +1078,47 @@ func TestGetBinary(t *testing.T) {
} }
} }
func validateSimpleGetOptionsParams(t *testing.T, route *restful.Route) {
// Validate name and description
expectedParams := map[string]string{
"param1": "description for param1",
"param2": "description for param2",
"atAPath": "",
}
for _, p := range route.ParameterDocs {
data := p.Data()
if desc, exists := expectedParams[data.Name]; exists {
if desc != data.Description {
t.Errorf("unexpected description for parameter %s: %s\n", data.Name, data.Description)
}
delete(expectedParams, data.Name)
}
}
if len(expectedParams) > 0 {
t.Errorf("did not find all expected parameters: %#v", expectedParams)
}
}
func TestGetWithOptionsRouteParams(t *testing.T) {
storage := map[string]rest.Storage{}
simpleStorage := GetWithOptionsRESTStorage{
SimpleRESTStorage: &SimpleRESTStorage{},
}
storage["simple"] = &simpleStorage
handler := handle(storage)
ws := handler.(*defaultAPIServer).container.RegisteredWebServices()
if len(ws) == 0 {
t.Fatal("no web services registered")
}
routes := ws[0].Routes()
for i := range routes {
if routes[i].Method == "GET" && routes[i].Operation == "readNamespacedSimple" {
validateSimpleGetOptionsParams(t, &routes[i])
break
}
}
}
func TestGetWithOptions(t *testing.T) { func TestGetWithOptions(t *testing.T) {
storage := map[string]rest.Storage{} storage := map[string]rest.Storage{}
simpleStorage := GetWithOptionsRESTStorage{ simpleStorage := GetWithOptionsRESTStorage{
...@@ -1292,6 +1333,33 @@ func TestConnect(t *testing.T) { ...@@ -1292,6 +1333,33 @@ func TestConnect(t *testing.T) {
} }
} }
func TestConnectWithOptionsRouteParams(t *testing.T) {
connectStorage := &ConnecterRESTStorage{
connectHandler: &SimpleConnectHandler{},
emptyConnectOptions: &SimpleGetOptions{},
}
storage := map[string]rest.Storage{
"simple": &SimpleRESTStorage{},
"simple/connect": connectStorage,
}
handler := handle(storage)
ws := handler.(*defaultAPIServer).container.RegisteredWebServices()
if len(ws) == 0 {
t.Fatal("no web services registered")
}
routes := ws[0].Routes()
for i := range routes {
switch routes[i].Operation {
case "connectGetNamespacedSimpleConnect":
case "connectPostNamespacedSimpleConnect":
case "connectPutNamespacedSimpleConnect":
case "connectDeleteNamespacedSimpleConnect":
validateSimpleGetOptionsParams(t, &routes[i])
}
}
}
func TestConnectWithOptions(t *testing.T) { func TestConnectWithOptions(t *testing.T) {
responseText := "Hello World" responseText := "Hello World"
itemID := "theID" itemID := "theID"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment