未验证 提交 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. ...@@ -17,7 +17,7 @@ Kubernetes Dashboard is a general purpose, web-based UI for Kubernetes clusters.
To deploy Dashboard, execute following command: To deploy Dashboard, execute following command:
```sh ```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: 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: ...@@ -176,7 +176,7 @@ spec:
spec: spec:
containers: containers:
- name: kubernetes-dashboard - name: kubernetes-dashboard
image: kubernetesui/dashboard:v2.0.0-rc2 image: kubernetesui/dashboard:v2.0.0-rc3
ports: ports:
- containerPort: 9090 - containerPort: 9090
protocol: TCP protocol: TCP
...@@ -253,7 +253,7 @@ spec: ...@@ -253,7 +253,7 @@ spec:
spec: spec:
containers: containers:
- name: dashboard-metrics-scraper - name: dashboard-metrics-scraper
image: kubernetesui/metrics-scraper:v1.0.2 image: kubernetesui/metrics-scraper:v1.0.3
ports: ports:
- containerPort: 8000 - containerPort: 8000
protocol: TCP protocol: TCP
......
...@@ -34,7 +34,7 @@ spec: ...@@ -34,7 +34,7 @@ spec:
spec: spec:
containers: containers:
- name: kubernetes-dashboard - name: kubernetes-dashboard
image: kubernetesui/dashboard:v2.0.0-rc2 image: kubernetesui/dashboard:v2.0.0-rc3
ports: ports:
- containerPort: 9090 - containerPort: 9090
protocol: TCP protocol: TCP
......
...@@ -34,7 +34,7 @@ spec: ...@@ -34,7 +34,7 @@ spec:
spec: spec:
containers: containers:
- name: dashboard-metrics-scraper - name: dashboard-metrics-scraper
image: kubernetesui/metrics-scraper:v1.0.2 image: kubernetesui/metrics-scraper:v1.0.3
ports: ports:
- containerPort: 8000 - containerPort: 8000
protocol: TCP protocol: TCP
......
...@@ -187,7 +187,7 @@ spec: ...@@ -187,7 +187,7 @@ spec:
spec: spec:
containers: containers:
- name: kubernetes-dashboard - name: kubernetes-dashboard
image: kubernetesui/dashboard:v2.0.0-rc2 image: kubernetesui/dashboard:v2.0.0-rc3
imagePullPolicy: Always imagePullPolicy: Always
ports: ports:
- containerPort: 8443 - containerPort: 8443
...@@ -271,7 +271,7 @@ spec: ...@@ -271,7 +271,7 @@ spec:
spec: spec:
containers: containers:
- name: dashboard-metrics-scraper - name: dashboard-metrics-scraper
image: kubernetesui/metrics-scraper:v1.0.2 image: kubernetesui/metrics-scraper:v1.0.3
ports: ports:
- containerPort: 8000 - containerPort: 8000
protocol: TCP protocol: TCP
......
...@@ -34,7 +34,7 @@ spec: ...@@ -34,7 +34,7 @@ spec:
spec: spec:
containers: containers:
- name: kubernetes-dashboard - name: kubernetes-dashboard
image: kubernetesui/dashboard:v2.0.0-rc2 image: kubernetesui/dashboard:v2.0.0-rc3
imagePullPolicy: Always imagePullPolicy: Always
ports: ports:
- containerPort: 8443 - containerPort: 8443
......
...@@ -34,7 +34,7 @@ spec: ...@@ -34,7 +34,7 @@ spec:
spec: spec:
containers: containers:
- name: dashboard-metrics-scraper - name: dashboard-metrics-scraper
image: kubernetesui/metrics-scraper:v1.0.2 image: kubernetesui/metrics-scraper:v1.0.3
ports: ports:
- containerPort: 8000 - containerPort: 8000
protocol: TCP protocol: TCP
......
...@@ -53,7 +53,7 @@ const version = { ...@@ -53,7 +53,7 @@ const version = {
/** /**
* Current release version of the project. * 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. * Version name of the head release of the project.
*/ */
......
...@@ -23,7 +23,7 @@ kubectl create secret generic kubernetes-dashboard-certs --from-file=$HOME/certs ...@@ -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: 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: 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 ...@@ -42,7 +42,7 @@ This setup is not fully secure. Certificates are not used and Dashboard is expos
To deploy Dashboard execute following command: 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 ...@@ -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: 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 ### Update
......
...@@ -15,209 +15,209 @@ ...@@ -15,209 +15,209 @@
package client package client
import ( import (
"net/http" "net/http"
"net/url" "net/url"
"reflect" "reflect"
"testing" "testing"
metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1" metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/kubernetes/scheme"
restclient "k8s.io/client-go/rest" restclient "k8s.io/client-go/rest"
"k8s.io/client-go/rest/fake" "k8s.io/client-go/rest/fake"
"github.com/kubernetes/dashboard/src/app/backend/errors" "github.com/kubernetes/dashboard/src/app/backend/errors"
) )
type clientFunc func(req *http.Request) (*http.Response, error) type clientFunc func(req *http.Request) (*http.Response, error)
func (f clientFunc) Do(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 { type FakeRESTClient struct {
response *http.Response response *http.Response
err error err error
} }
func NewFakeClientFunc(c *FakeRESTClient) clientFunc { func NewFakeClientFunc(c *FakeRESTClient) clientFunc {
return clientFunc(func(req *http.Request) (*http.Response, error) { return clientFunc(func(req *http.Request) (*http.Response, error) {
return c.response, c.err return c.response, c.err
}) })
} }
func (c *FakeRESTClient) Delete() *restclient.Request { func (c *FakeRESTClient) Delete() *restclient.Request {
runtimeScheme := runtime.NewScheme() runtimeScheme := runtime.NewScheme()
groupVersion := schema.GroupVersion{Group: "meta.k8s.io", Version: "v1"} groupVersion := schema.GroupVersion{Group: "meta.k8s.io", Version: "v1"}
runtimeScheme.AddKnownTypes(groupVersion, &metaV1.DeleteOptions{}) runtimeScheme.AddKnownTypes(groupVersion, &metaV1.DeleteOptions{})
contentConfig := restclient.ContentConfig{ contentConfig := restclient.ContentConfig{
ContentType: "application/json", ContentType: "application/json",
GroupVersion: &groupVersion, GroupVersion: &groupVersion,
NegotiatedSerializer: scheme.Codecs.WithoutConversion(), NegotiatedSerializer: scheme.Codecs.WithoutConversion(),
} }
return restclient.NewRequestWithClient(&url.URL{Path: "/api/v1/"}, "", return restclient.NewRequestWithClient(&url.URL{Path: "/api/v1/"}, "",
restclient.ClientContentConfig{ restclient.ClientContentConfig{
Negotiator: runtime.NewClientNegotiator(contentConfig.NegotiatedSerializer, groupVersion), Negotiator: runtime.NewClientNegotiator(contentConfig.NegotiatedSerializer, groupVersion),
}, fake.CreateHTTPClient(NewFakeClientFunc(c))).Verb("DELETE") }, fake.CreateHTTPClient(NewFakeClientFunc(c))).Verb("DELETE")
} }
func (c *FakeRESTClient) Put() *restclient.Request { 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 { 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) { func TestDeleteShouldPropagateErrorsAndChooseClient(t *testing.T) {
verber := resourceVerber{ verber := resourceVerber{
client: &FakeRESTClient{err: errors.NewInvalid("err")}, client: &FakeRESTClient{err: errors.NewInvalid("err")},
extensionsClient: &FakeRESTClient{err: errors.NewInvalid("err from extensions")}, extensionsClient: &FakeRESTClient{err: errors.NewInvalid("err from extensions")},
appsClient: &FakeRESTClient{err: errors.NewInvalid("err from apps")}, 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") { 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()) 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") { 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()) 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") { 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()) t.Fatalf("Expected error on verber delete but got %#v", err.Error())
} }
} }
func TestGetShouldPropagateErrorsAndChoseClient(t *testing.T) { func TestGetShouldPropagateErrorsAndChoseClient(t *testing.T) {
verber := resourceVerber{ verber := resourceVerber{
client: &FakeRESTClient{err: errors.NewInvalid("err")}, client: &FakeRESTClient{err: errors.NewInvalid("err")},
extensionsClient: &FakeRESTClient{err: errors.NewInvalid("err from extensions")}, extensionsClient: &FakeRESTClient{err: errors.NewInvalid("err from extensions")},
appsClient: &FakeRESTClient{err: errors.NewInvalid("err from apps")}, 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") { 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()) 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") { 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()) 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") { 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()) t.Fatalf("Expected error on verber delete but got %#v", err.Error())
} }
} }
func TestDeleteShouldThrowErrorOnUnknownResourceKind(t *testing.T) { func TestDeleteShouldThrowErrorOnUnknownResourceKind(t *testing.T) {
verber := resourceVerber{ verber := resourceVerber{
client: &FakeRESTClient{}, client: &FakeRESTClient{},
apiExtensionsClient: &FakeRESTClient{err: errors.NewNotFound("err")}, 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") { if !reflect.DeepEqual(err.Error(), "Get /api/v1/customresourcedefinitions/foo: err") {
t.Fatalf("Expected error on verber delete but got %#v", err.Error()) t.Fatalf("Expected error on verber delete but got %#v", err.Error())
} }
} }
func TestGetShouldThrowErrorOnUnknownResourceKind(t *testing.T) { func TestGetShouldThrowErrorOnUnknownResourceKind(t *testing.T) {
verber := resourceVerber{ verber := resourceVerber{
client: &FakeRESTClient{}, client: &FakeRESTClient{},
apiExtensionsClient: &FakeRESTClient{err: errors.NewNotFound("err")}, 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") { if !reflect.DeepEqual(err.Error(), "Get /api/v1/customresourcedefinitions/foo: err") {
t.Fatalf("Expected error on verber get but got %#v", err.Error()) t.Fatalf("Expected error on verber get but got %#v", err.Error())
} }
} }
func TestPutShouldThrowErrorOnUnknownResourceKind(t *testing.T) { func TestPutShouldThrowErrorOnUnknownResourceKind(t *testing.T) {
verber := resourceVerber{ verber := resourceVerber{
client: &FakeRESTClient{}, client: &FakeRESTClient{},
apiExtensionsClient: &FakeRESTClient{err: errors.NewNotFound("err")}, 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") { if !reflect.DeepEqual(err.Error(), "Get /api/v1/customresourcedefinitions/foo: err") {
t.Fatalf("Expected error on verber put but got %#v", err.Error()) t.Fatalf("Expected error on verber put but got %#v", err.Error())
} }
} }
func TestGetShouldRespectNamespacednessOfResourceKind(t *testing.T) { 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")) { 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) t.Fatalf("Expected error on verber get but got %#v", err)
} }
} }
func TestPutShouldRespectNamespacednessOfResourceKind(t *testing.T) { 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")) { 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) t.Fatalf("Expected error on verber put but got %#v", err)
} }
} }
func TestDeleteShouldRespectNamespacednessOfResourceKind(t *testing.T) { 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")) { 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) t.Fatalf("Expected error on verber delete but got %#v", err)
} }
} }
func TestGetShouldRespectNotNamespacednessOfResourceKind(t *testing.T) { 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")) { 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) t.Fatalf("Expected error on verber get but got %#v", err)
} }
} }
func TestPutShouldRespectNotNamespacednessOfResourceKind(t *testing.T) { 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")) { 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) t.Fatalf("Expected error on verber put but got %#v", err)
} }
} }
func TestDeleteShouldRespectNotNamespacednessOfResourceKind(t *testing.T) { 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")) { 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) 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.
先完成此消息的编辑!
想要评论请 注册