未验证 提交 1f9c707e 编写于 作者: S Sebastian Florek 提交者: GitHub

Bump version to v2.0.0-rc3 (#4836)

* Bump version to v2.0.0-rc3

* Fix imports
上级 8484786d
......@@ -17,7 +17,7 @@ Kubernetes Dashboard is a general purpose, web-based UI for Kubernetes clusters.
To deploy Dashboard, execute following command:
```sh
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc2/aio/deploy/recommended.yaml
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc3/aio/deploy/recommended.yaml
```
To access Dashboard from your local workstation you must create a secure channel to your Kubernetes cluster. Run the following command:
......
......@@ -176,7 +176,7 @@ spec:
spec:
containers:
- name: kubernetes-dashboard
image: kubernetesui/dashboard:v2.0.0-rc2
image: kubernetesui/dashboard:v2.0.0-rc3
ports:
- containerPort: 9090
protocol: TCP
......@@ -253,7 +253,7 @@ spec:
spec:
containers:
- name: dashboard-metrics-scraper
image: kubernetesui/metrics-scraper:v1.0.2
image: kubernetesui/metrics-scraper:v1.0.3
ports:
- containerPort: 8000
protocol: TCP
......
......@@ -34,7 +34,7 @@ spec:
spec:
containers:
- name: kubernetes-dashboard
image: kubernetesui/dashboard:v2.0.0-rc2
image: kubernetesui/dashboard:v2.0.0-rc3
ports:
- containerPort: 9090
protocol: TCP
......
......@@ -34,7 +34,7 @@ spec:
spec:
containers:
- name: dashboard-metrics-scraper
image: kubernetesui/metrics-scraper:v1.0.2
image: kubernetesui/metrics-scraper:v1.0.3
ports:
- containerPort: 8000
protocol: TCP
......
......@@ -187,7 +187,7 @@ spec:
spec:
containers:
- name: kubernetes-dashboard
image: kubernetesui/dashboard:v2.0.0-rc2
image: kubernetesui/dashboard:v2.0.0-rc3
imagePullPolicy: Always
ports:
- containerPort: 8443
......@@ -271,7 +271,7 @@ spec:
spec:
containers:
- name: dashboard-metrics-scraper
image: kubernetesui/metrics-scraper:v1.0.2
image: kubernetesui/metrics-scraper:v1.0.3
ports:
- containerPort: 8000
protocol: TCP
......
......@@ -34,7 +34,7 @@ spec:
spec:
containers:
- name: kubernetes-dashboard
image: kubernetesui/dashboard:v2.0.0-rc2
image: kubernetesui/dashboard:v2.0.0-rc3
imagePullPolicy: Always
ports:
- containerPort: 8443
......
......@@ -34,7 +34,7 @@ spec:
spec:
containers:
- name: dashboard-metrics-scraper
image: kubernetesui/metrics-scraper:v1.0.2
image: kubernetesui/metrics-scraper:v1.0.3
ports:
- containerPort: 8000
protocol: TCP
......
......@@ -53,7 +53,7 @@ const version = {
/**
* Current release version of the project.
*/
release: 'v2.0.0-rc2',
release: 'v2.0.0-rc3',
/**
* Version name of the head release of the project.
*/
......
......@@ -23,7 +23,7 @@ kubectl create secret generic kubernetes-dashboard-certs --from-file=$HOME/certs
For Dashboard to pickup the certificates, you must pass arguments `--tls-cert-file=/tls.crt` and `--tls-key-file=/tls.key` to the container. You can edit YAML definition and deploy Dashboard in one go:
```
kubectl create --edit -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc2/aio/deploy/recommended.yaml
kubectl create --edit -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc3/aio/deploy/recommended.yaml
```
Under Deployment section, add arguments to pod definition, it should look as follows:
......@@ -42,7 +42,7 @@ This setup is not fully secure. Certificates are not used and Dashboard is expos
To deploy Dashboard execute following command:
```
kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc2/aio/deploy/alternative.yaml
kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc3/aio/deploy/alternative.yaml
```
......@@ -55,7 +55,7 @@ Besides official releases, there are also development releases, that are pushed
In most of the use cases you need to execute the following command to deploy latest development release:
```
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc2/aio/deploy/head.yaml
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc3/aio/deploy/head.yaml
```
### Update
......
......@@ -15,209 +15,209 @@
package client
import (
"net/http"
"net/url"
"reflect"
"testing"
metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/kubernetes/scheme"
restclient "k8s.io/client-go/rest"
"k8s.io/client-go/rest/fake"
"github.com/kubernetes/dashboard/src/app/backend/errors"
"net/http"
"net/url"
"reflect"
"testing"
metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/kubernetes/scheme"
restclient "k8s.io/client-go/rest"
"k8s.io/client-go/rest/fake"
"github.com/kubernetes/dashboard/src/app/backend/errors"
)
type clientFunc func(req *http.Request) (*http.Response, error)
func (f clientFunc) Do(req *http.Request) (*http.Response, error) {
return f(req)
return f(req)
}
type FakeRESTClient struct {
response *http.Response
err error
response *http.Response
err error
}
func NewFakeClientFunc(c *FakeRESTClient) clientFunc {
return clientFunc(func(req *http.Request) (*http.Response, error) {
return c.response, c.err
})
return clientFunc(func(req *http.Request) (*http.Response, error) {
return c.response, c.err
})
}
func (c *FakeRESTClient) Delete() *restclient.Request {
runtimeScheme := runtime.NewScheme()
groupVersion := schema.GroupVersion{Group: "meta.k8s.io", Version: "v1"}
runtimeScheme.AddKnownTypes(groupVersion, &metaV1.DeleteOptions{})
contentConfig := restclient.ContentConfig{
ContentType: "application/json",
GroupVersion: &groupVersion,
NegotiatedSerializer: scheme.Codecs.WithoutConversion(),
}
runtimeScheme := runtime.NewScheme()
groupVersion := schema.GroupVersion{Group: "meta.k8s.io", Version: "v1"}
runtimeScheme.AddKnownTypes(groupVersion, &metaV1.DeleteOptions{})
contentConfig := restclient.ContentConfig{
ContentType: "application/json",
GroupVersion: &groupVersion,
NegotiatedSerializer: scheme.Codecs.WithoutConversion(),
}
return restclient.NewRequestWithClient(&url.URL{Path: "/api/v1/"}, "",
restclient.ClientContentConfig{
Negotiator: runtime.NewClientNegotiator(contentConfig.NegotiatedSerializer, groupVersion),
}, fake.CreateHTTPClient(NewFakeClientFunc(c))).Verb("DELETE")
return restclient.NewRequestWithClient(&url.URL{Path: "/api/v1/"}, "",
restclient.ClientContentConfig{
Negotiator: runtime.NewClientNegotiator(contentConfig.NegotiatedSerializer, groupVersion),
}, fake.CreateHTTPClient(NewFakeClientFunc(c))).Verb("DELETE")
}
func (c *FakeRESTClient) Put() *restclient.Request {
return restclient.NewRequestWithClient(&url.URL{Path: "/api/v1/"}, "", restclient.ClientContentConfig{}, fake.CreateHTTPClient(NewFakeClientFunc(c))).Verb("PUT")
return restclient.NewRequestWithClient(&url.URL{Path: "/api/v1/"}, "", restclient.ClientContentConfig{}, fake.CreateHTTPClient(NewFakeClientFunc(c))).Verb("PUT")
}
func (c *FakeRESTClient) Get() *restclient.Request {
return restclient.NewRequestWithClient(&url.URL{Path: "/api/v1/"}, "", restclient.ClientContentConfig{}, fake.CreateHTTPClient(NewFakeClientFunc(c))).Verb("GET")
return restclient.NewRequestWithClient(&url.URL{Path: "/api/v1/"}, "", restclient.ClientContentConfig{}, fake.CreateHTTPClient(NewFakeClientFunc(c))).Verb("GET")
}
func TestDeleteShouldPropagateErrorsAndChooseClient(t *testing.T) {
verber := resourceVerber{
client: &FakeRESTClient{err: errors.NewInvalid("err")},
extensionsClient: &FakeRESTClient{err: errors.NewInvalid("err from extensions")},
appsClient: &FakeRESTClient{err: errors.NewInvalid("err from apps")},
}
verber := resourceVerber{
client: &FakeRESTClient{err: errors.NewInvalid("err")},
extensionsClient: &FakeRESTClient{err: errors.NewInvalid("err from extensions")},
appsClient: &FakeRESTClient{err: errors.NewInvalid("err from apps")},
}
err := verber.Delete("replicaset", true, "bar", "baz")
err := verber.Delete("replicaset", true, "bar", "baz")
if !reflect.DeepEqual(err.Error(), "Delete /api/v1/namespaces/bar/replicasets/baz: err from apps") {
t.Fatalf("Expected error on verber delete but got %#v", err.Error())
}
if !reflect.DeepEqual(err.Error(), "Delete /api/v1/namespaces/bar/replicasets/baz: err from apps") {
t.Fatalf("Expected error on verber delete but got %#v", err.Error())
}
err = verber.Delete("service", true, "bar", "baz")
err = verber.Delete("service", true, "bar", "baz")
if !reflect.DeepEqual(err.Error(), "Delete /api/v1/namespaces/bar/services/baz: err") {
t.Fatalf("Expected error on verber delete but got %#v", err.Error())
}
if !reflect.DeepEqual(err.Error(), "Delete /api/v1/namespaces/bar/services/baz: err") {
t.Fatalf("Expected error on verber delete but got %#v", err.Error())
}
err = verber.Delete("statefulset", true, "bar", "baz")
err = verber.Delete("statefulset", true, "bar", "baz")
if !reflect.DeepEqual(err.Error(), "Delete /api/v1/namespaces/bar/statefulsets/baz: err from apps") {
t.Fatalf("Expected error on verber delete but got %#v", err.Error())
}
if !reflect.DeepEqual(err.Error(), "Delete /api/v1/namespaces/bar/statefulsets/baz: err from apps") {
t.Fatalf("Expected error on verber delete but got %#v", err.Error())
}
}
func TestGetShouldPropagateErrorsAndChoseClient(t *testing.T) {
verber := resourceVerber{
client: &FakeRESTClient{err: errors.NewInvalid("err")},
extensionsClient: &FakeRESTClient{err: errors.NewInvalid("err from extensions")},
appsClient: &FakeRESTClient{err: errors.NewInvalid("err from apps")},
}
verber := resourceVerber{
client: &FakeRESTClient{err: errors.NewInvalid("err")},
extensionsClient: &FakeRESTClient{err: errors.NewInvalid("err from extensions")},
appsClient: &FakeRESTClient{err: errors.NewInvalid("err from apps")},
}
_, err := verber.Get("replicaset", true, "bar", "baz")
_, err := verber.Get("replicaset", true, "bar", "baz")
if !reflect.DeepEqual(err.Error(), "Get /api/v1/namespaces/bar/replicasets/baz: err from apps") {
t.Fatalf("Expected error on verber delete but got %#v", err.Error())
}
if !reflect.DeepEqual(err.Error(), "Get /api/v1/namespaces/bar/replicasets/baz: err from apps") {
t.Fatalf("Expected error on verber delete but got %#v", err.Error())
}
_, err = verber.Get("service", true, "bar", "baz")
_, err = verber.Get("service", true, "bar", "baz")
if !reflect.DeepEqual(err.Error(), "Get /api/v1/namespaces/bar/services/baz: err") {
t.Fatalf("Expected error on verber delete but got %#v", err.Error())
}
if !reflect.DeepEqual(err.Error(), "Get /api/v1/namespaces/bar/services/baz: err") {
t.Fatalf("Expected error on verber delete but got %#v", err.Error())
}
_, err = verber.Get("statefulset", true, "bar", "baz")
_, err = verber.Get("statefulset", true, "bar", "baz")
if !reflect.DeepEqual(err.Error(), "Get /api/v1/namespaces/bar/statefulsets/baz: err from apps") {
t.Fatalf("Expected error on verber delete but got %#v", err.Error())
}
if !reflect.DeepEqual(err.Error(), "Get /api/v1/namespaces/bar/statefulsets/baz: err from apps") {
t.Fatalf("Expected error on verber delete but got %#v", err.Error())
}
}
func TestDeleteShouldThrowErrorOnUnknownResourceKind(t *testing.T) {
verber := resourceVerber{
client: &FakeRESTClient{},
apiExtensionsClient: &FakeRESTClient{err: errors.NewNotFound("err")},
}
verber := resourceVerber{
client: &FakeRESTClient{},
apiExtensionsClient: &FakeRESTClient{err: errors.NewNotFound("err")},
}
err := verber.Delete("foo", true, "bar", "baz")
err := verber.Delete("foo", true, "bar", "baz")
if !reflect.DeepEqual(err.Error(), "Get /api/v1/customresourcedefinitions/foo: err") {
t.Fatalf("Expected error on verber delete but got %#v", err.Error())
}
if !reflect.DeepEqual(err.Error(), "Get /api/v1/customresourcedefinitions/foo: err") {
t.Fatalf("Expected error on verber delete but got %#v", err.Error())
}
}
func TestGetShouldThrowErrorOnUnknownResourceKind(t *testing.T) {
verber := resourceVerber{
client: &FakeRESTClient{},
apiExtensionsClient: &FakeRESTClient{err: errors.NewNotFound("err")},
}
verber := resourceVerber{
client: &FakeRESTClient{},
apiExtensionsClient: &FakeRESTClient{err: errors.NewNotFound("err")},
}
_, err := verber.Get("foo", true, "bar", "baz")
_, err := verber.Get("foo", true, "bar", "baz")
if !reflect.DeepEqual(err.Error(), "Get /api/v1/customresourcedefinitions/foo: err") {
t.Fatalf("Expected error on verber get but got %#v", err.Error())
}
if !reflect.DeepEqual(err.Error(), "Get /api/v1/customresourcedefinitions/foo: err") {
t.Fatalf("Expected error on verber get but got %#v", err.Error())
}
}
func TestPutShouldThrowErrorOnUnknownResourceKind(t *testing.T) {
verber := resourceVerber{
client: &FakeRESTClient{},
apiExtensionsClient: &FakeRESTClient{err: errors.NewNotFound("err")},
}
verber := resourceVerber{
client: &FakeRESTClient{},
apiExtensionsClient: &FakeRESTClient{err: errors.NewNotFound("err")},
}
err := verber.Put("foo", false, "", "baz", nil)
err := verber.Put("foo", false, "", "baz", nil)
if !reflect.DeepEqual(err.Error(), "Get /api/v1/customresourcedefinitions/foo: err") {
t.Fatalf("Expected error on verber put but got %#v", err.Error())
}
if !reflect.DeepEqual(err.Error(), "Get /api/v1/customresourcedefinitions/foo: err") {
t.Fatalf("Expected error on verber put but got %#v", err.Error())
}
}
func TestGetShouldRespectNamespacednessOfResourceKind(t *testing.T) {
verber := resourceVerber{client: &FakeRESTClient{}}
verber := resourceVerber{client: &FakeRESTClient{}}
_, err := verber.Get("service", false, "", "baz")
_, err := verber.Get("service", false, "", "baz")
if !reflect.DeepEqual(err, errors.NewInvalid("Set no namespace for namespaced resource kind: service")) {
t.Fatalf("Expected error on verber get but got %#v", err)
}
if !reflect.DeepEqual(err, errors.NewInvalid("Set no namespace for namespaced resource kind: service")) {
t.Fatalf("Expected error on verber get but got %#v", err)
}
}
func TestPutShouldRespectNamespacednessOfResourceKind(t *testing.T) {
verber := resourceVerber{client: &FakeRESTClient{}}
verber := resourceVerber{client: &FakeRESTClient{}}
err := verber.Put("service", false, "", "baz", nil)
err := verber.Put("service", false, "", "baz", nil)
if !reflect.DeepEqual(err, errors.NewInvalid("Set no namespace for namespaced resource kind: service")) {
t.Fatalf("Expected error on verber put but got %#v", err)
}
if !reflect.DeepEqual(err, errors.NewInvalid("Set no namespace for namespaced resource kind: service")) {
t.Fatalf("Expected error on verber put but got %#v", err)
}
}
func TestDeleteShouldRespectNamespacednessOfResourceKind(t *testing.T) {
verber := resourceVerber{client: &FakeRESTClient{}}
verber := resourceVerber{client: &FakeRESTClient{}}
err := verber.Delete("service", false, "", "baz")
err := verber.Delete("service", false, "", "baz")
if !reflect.DeepEqual(err, errors.NewInvalid("Set no namespace for namespaced resource kind: service")) {
t.Fatalf("Expected error on verber delete but got %#v", err)
}
if !reflect.DeepEqual(err, errors.NewInvalid("Set no namespace for namespaced resource kind: service")) {
t.Fatalf("Expected error on verber delete but got %#v", err)
}
}
func TestGetShouldRespectNotNamespacednessOfResourceKind(t *testing.T) {
verber := resourceVerber{client: &FakeRESTClient{}}
verber := resourceVerber{client: &FakeRESTClient{}}
_, err := verber.Get("namespace", true, "bar", "baz")
_, err := verber.Get("namespace", true, "bar", "baz")
if !reflect.DeepEqual(err, errors.NewInvalid("Set namespace for not-namespaced resource kind: namespace")) {
t.Fatalf("Expected error on verber get but got %#v", err)
}
if !reflect.DeepEqual(err, errors.NewInvalid("Set namespace for not-namespaced resource kind: namespace")) {
t.Fatalf("Expected error on verber get but got %#v", err)
}
}
func TestPutShouldRespectNotNamespacednessOfResourceKind(t *testing.T) {
verber := resourceVerber{client: &FakeRESTClient{}}
verber := resourceVerber{client: &FakeRESTClient{}}
err := verber.Put("namespace", true, "bar", "baz", nil)
err := verber.Put("namespace", true, "bar", "baz", nil)
if !reflect.DeepEqual(err, errors.NewInvalid("Set namespace for not-namespaced resource kind: namespace")) {
t.Fatalf("Expected error on verber put but got %#v", err)
}
if !reflect.DeepEqual(err, errors.NewInvalid("Set namespace for not-namespaced resource kind: namespace")) {
t.Fatalf("Expected error on verber put but got %#v", err)
}
}
func TestDeleteShouldRespectNotNamespacednessOfResourceKind(t *testing.T) {
verber := resourceVerber{client: &FakeRESTClient{}}
verber := resourceVerber{client: &FakeRESTClient{}}
err := verber.Delete("namespace", true, "bar", "baz")
err := verber.Delete("namespace", true, "bar", "baz")
if !reflect.DeepEqual(err, errors.NewInvalid("Set namespace for not-namespaced resource kind: namespace")) {
t.Fatalf("Expected error on verber delete but got %#v", err)
}
if !reflect.DeepEqual(err, errors.NewInvalid("Set namespace for not-namespaced resource kind: namespace")) {
t.Fatalf("Expected error on verber delete but got %#v", err)
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册