Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
H
helm3
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
go
helm3
Commits
85c41ef1
Commit
85c41ef1
authored
Apr 11, 2017
by
Adam Reese
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ref(*): kubernetes v1.6
Rebase on kubernetes v1.6
parent
e89e6af0
Show whitespace changes
Inline
Side-by-side
Showing
31 changed files
with
676 additions
and
658 deletions
+676
-658
Makefile
Makefile
+1
-0
helm.go
cmd/helm/helm.go
+2
-8
init.go
cmd/helm/init.go
+2
-2
init_test.go
cmd/helm/init_test.go
+6
-5
install.go
cmd/helm/installer/install.go
+13
-16
install_test.go
cmd/helm/installer/install_test.go
+4
-4
uninstall.go
cmd/helm/installer/uninstall.go
+22
-44
uninstall_test.go
cmd/helm/installer/uninstall_test.go
+16
-111
reset.go
cmd/helm/reset.go
+1
-6
reset_test.go
cmd/helm/reset_test.go
+0
-18
glide.lock
glide.lock
+220
-124
glide.yaml
glide.yaml
+10
-33
capabilities.go
pkg/chartutil/capabilities.go
+1
-1
load.go
pkg/chartutil/load.go
+1
-1
values_test.go
pkg/chartutil/values_test.go
+1
-1
portforwarder.go
pkg/helm/portforwarder/portforwarder.go
+5
-4
portforwarder_test.go
pkg/helm/portforwarder/portforwarder_test.go
+2
-1
client.go
pkg/kube/client.go
+54
-211
client_test.go
pkg/kube/client_test.go
+51
-30
config.go
pkg/kube/config.go
+1
-1
namespace.go
pkg/kube/namespace.go
+4
-3
namespace_test.go
pkg/kube/namespace_test.go
+2
-1
result_test.go
pkg/kube/result_test.go
+2
-2
tunnel.go
pkg/kube/tunnel.go
+5
-5
wait.go
pkg/kube/wait.go
+195
-0
filter_test.go
pkg/releaseutil/filter_test.go
+2
-1
sorter_test.go
pkg/releaseutil/sorter_test.go
+3
-2
cfgmaps.go
pkg/storage/driver/cfgmaps.go
+13
-12
mock_test.go
pkg/storage/driver/mock_test.go
+9
-8
release_server.go
pkg/tiller/release_server.go
+3
-3
setup-apimachinery.sh
scripts/setup-apimachinery.sh
+25
-0
No files found.
Makefile
View file @
85c41ef1
...
...
@@ -119,5 +119,6 @@ ifndef HAS_GIT
endif
glide
install
--strip-vendor
go
build
-o
bin/protoc-gen-go
./vendor/github.com/golang/protobuf/protoc-gen-go
scripts/setup-apimachinery.sh
include
versioning.mk
cmd/helm/helm.go
View file @
85c41ef1
...
...
@@ -29,8 +29,8 @@ import (
"github.com/spf13/cobra"
"google.golang.org/grpc"
"google.golang.org/grpc/grpclog"
"k8s.io/client-go/rest"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
"k8s.io/kubernetes/pkg/client/restclient"
"k8s.io/helm/pkg/helm"
"k8s.io/helm/pkg/helm/helmpath"
...
...
@@ -258,7 +258,7 @@ func defaultTillerNamespace() string {
// getKubeClient is a convenience method for creating kubernetes config and client
// for a given kubeconfig context
func
getKubeClient
(
context
string
)
(
*
rest
client
.
Config
,
*
internalclientset
.
Clientset
,
error
)
{
func
getKubeClient
(
context
string
)
(
*
rest
.
Config
,
*
internalclientset
.
Clientset
,
error
)
{
config
,
err
:=
kube
.
GetConfig
(
context
)
.
ClientConfig
()
if
err
!=
nil
{
return
nil
,
nil
,
fmt
.
Errorf
(
"could not get kubernetes config for context '%s': %s"
,
context
,
err
)
...
...
@@ -270,12 +270,6 @@ func getKubeClient(context string) (*restclient.Config, *internalclientset.Clien
return
config
,
client
,
nil
}
// getKubeCmd is a convenience method for creating kubernetes cmd client
// for a given kubeconfig context
func
getKubeCmd
(
context
string
)
*
kube
.
Client
{
return
kube
.
New
(
kube
.
GetConfig
(
context
))
}
// ensureHelmClient returns a new helm client impl. if h is not nil.
func
ensureHelmClient
(
h
helm
.
Interface
)
helm
.
Interface
{
if
h
!=
nil
{
...
...
cmd/helm/init.go
View file @
85c41ef1
...
...
@@ -23,7 +23,7 @@ import (
"os"
"github.com/spf13/cobra"
kerrors
"k8s.io/kubernetes
/pkg/api/errors"
apierrors
"k8s.io/apimachinery
/pkg/api/errors"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
"k8s.io/helm/cmd/helm/installer"
...
...
@@ -226,7 +226,7 @@ func (i *initCmd) run() error {
i
.
kubeClient
=
c
}
if
err
:=
installer
.
Install
(
i
.
kubeClient
,
&
i
.
opts
);
err
!=
nil
{
if
!
k
errors
.
IsAlreadyExists
(
err
)
{
if
!
api
errors
.
IsAlreadyExists
(
err
)
{
return
fmt
.
Errorf
(
"error installing: %s"
,
err
)
}
if
i
.
upgrade
{
...
...
cmd/helm/init_test.go
View file @
85c41ef1
...
...
@@ -25,12 +25,13 @@ import (
"github.com/ghodss/yaml"
apierrors
"k8s.io/apimachinery/pkg/api/errors"
metav1
"k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
testcore
"k8s.io/client-go/testing"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake"
testcore
"k8s.io/kubernetes/pkg/client/testing/core"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/helm/pkg/helm/helmpath"
)
...
...
@@ -78,13 +79,13 @@ func TestInitCmd_exists(t *testing.T) {
var
buf
bytes
.
Buffer
fc
:=
fake
.
NewSimpleClientset
(
&
extensions
.
Deployment
{
ObjectMeta
:
api
.
ObjectMeta
{
ObjectMeta
:
metav1
.
ObjectMeta
{
Namespace
:
api
.
NamespaceDefault
,
Name
:
"tiller-deploy"
,
},
})
fc
.
PrependReactor
(
"*"
,
"*"
,
func
(
action
testcore
.
Action
)
(
bool
,
runtime
.
Object
,
error
)
{
return
true
,
nil
,
errors
.
NewAlreadyExists
(
api
.
Resource
(
"deployments"
),
"1"
)
return
true
,
nil
,
api
errors
.
NewAlreadyExists
(
api
.
Resource
(
"deployments"
),
"1"
)
})
cmd
:=
&
initCmd
{
out
:
&
buf
,
...
...
cmd/helm/installer/install.go
View file @
85c41ef1
...
...
@@ -20,13 +20,14 @@ import (
"io/ioutil"
"github.com/ghodss/yaml"
apierrors
"k8s.io/apimachinery/pkg/api/errors"
metav1
"k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/intstr"
"k8s.io/kubernetes/pkg/api"
kerrors
"k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion"
extensionsclient
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/internalversion"
"k8s.io/kubernetes/pkg/util/intstr"
)
// Install uses kubernetes client to install tiller.
...
...
@@ -51,7 +52,7 @@ func Install(client internalclientset.Interface, opts *Options) error {
//
// Returns an error if the command failed.
func
Upgrade
(
client
internalclientset
.
Interface
,
opts
*
Options
)
error
{
obj
,
err
:=
client
.
Extensions
()
.
Deployments
(
opts
.
Namespace
)
.
Get
(
"tiller-deploy"
)
obj
,
err
:=
client
.
Extensions
()
.
Deployments
(
opts
.
Namespace
)
.
Get
(
deploymentName
,
metav1
.
GetOptions
{}
)
if
err
!=
nil
{
return
err
}
...
...
@@ -62,15 +63,11 @@ func Upgrade(client internalclientset.Interface, opts *Options) error {
}
// If the service does not exists that would mean we are upgrading from a tiller version
// that didn't deploy the service, so install it.
if
_
,
err
:=
client
.
Core
()
.
Services
(
opts
.
Namespace
)
.
Get
(
"tiller-deploy"
);
err
!=
nil
{
if
!
k
errors
.
IsNotFound
(
err
)
{
return
err
_
,
err
=
client
.
Core
()
.
Services
(
opts
.
Namespace
)
.
Get
(
serviceName
,
metav1
.
GetOptions
{})
if
api
errors
.
IsNotFound
(
err
)
{
return
createService
(
client
.
Core
(),
opts
.
Namespace
)
}
if
err
:=
createService
(
client
.
Core
(),
opts
.
Namespace
);
err
!=
nil
{
return
err
}
}
return
nil
}
// createDeployment creates the Tiller deployment reource
...
...
@@ -122,15 +119,15 @@ func generateLabels(labels map[string]string) map[string]string {
func
generateDeployment
(
opts
*
Options
)
*
extensions
.
Deployment
{
labels
:=
generateLabels
(
map
[
string
]
string
{
"name"
:
"tiller"
})
d
:=
&
extensions
.
Deployment
{
ObjectMeta
:
api
.
ObjectMeta
{
ObjectMeta
:
metav1
.
ObjectMeta
{
Namespace
:
opts
.
Namespace
,
Name
:
"tiller-deploy"
,
Name
:
deploymentName
,
Labels
:
labels
,
},
Spec
:
extensions
.
DeploymentSpec
{
Replicas
:
1
,
Template
:
api
.
PodTemplateSpec
{
ObjectMeta
:
api
.
ObjectMeta
{
ObjectMeta
:
metav1
.
ObjectMeta
{
Labels
:
labels
,
},
Spec
:
api
.
PodSpec
{
...
...
@@ -208,9 +205,9 @@ func generateDeployment(opts *Options) *extensions.Deployment {
func
generateService
(
namespace
string
)
*
api
.
Service
{
labels
:=
generateLabels
(
map
[
string
]
string
{
"name"
:
"tiller"
})
s
:=
&
api
.
Service
{
ObjectMeta
:
api
.
ObjectMeta
{
ObjectMeta
:
metav1
.
ObjectMeta
{
Namespace
:
namespace
,
Name
:
"tiller-deploy"
,
Name
:
serviceName
,
Labels
:
labels
,
},
Spec
:
api
.
ServiceSpec
{
...
...
@@ -256,7 +253,7 @@ func generateSecret(opts *Options) (*api.Secret, error) {
secret
:=
&
api
.
Secret
{
Type
:
api
.
SecretTypeOpaque
,
Data
:
make
(
map
[
string
][]
byte
),
ObjectMeta
:
api
.
ObjectMeta
{
ObjectMeta
:
metav1
.
ObjectMeta
{
Name
:
secretName
,
Labels
:
labels
,
Namespace
:
opts
.
Namespace
,
...
...
cmd/helm/installer/install_test.go
View file @
85c41ef1
...
...
@@ -21,12 +21,12 @@ import (
"testing"
"github.com/ghodss/yaml"
apierrors
"k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/runtime"
testcore
"k8s.io/client-go/testing"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake"
testcore
"k8s.io/kubernetes/pkg/client/testing/core"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/helm/pkg/version"
)
...
...
@@ -206,7 +206,7 @@ func TestUpgrade_serviceNotFound(t *testing.T) {
return
true
,
obj
,
nil
})
fc
.
AddReactor
(
"get"
,
"services"
,
func
(
action
testcore
.
Action
)
(
bool
,
runtime
.
Object
,
error
)
{
return
true
,
nil
,
errors
.
NewNotFound
(
api
.
Resource
(
"services"
),
"1"
)
return
true
,
nil
,
api
errors
.
NewNotFound
(
api
.
Resource
(
"services"
),
"1"
)
})
fc
.
AddReactor
(
"create"
,
"services"
,
func
(
action
testcore
.
Action
)
(
bool
,
runtime
.
Object
,
error
)
{
obj
:=
action
.
(
testcore
.
CreateAction
)
.
GetObject
()
.
(
*
api
.
Service
)
...
...
cmd/helm/installer/uninstall.go
View file @
85c41ef1
...
...
@@ -17,67 +17,45 @@ limitations under the License.
package
installer
// import "k8s.io/helm/cmd/helm/installer"
import
(
"strings"
"github.com/ghodss/yaml"
"k8s.io/kubernetes/pkg/api"
kerrors
"k8s.io/kubernetes/pkg/api/errors"
apierrors
"k8s.io/apimachinery/pkg/api/errors"
metav1
"k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion"
"k8s.io/kubernetes/pkg/kubectl"
)
"k8s.io/helm/pkg/kube"
const
(
deploymentName
=
"tiller-deploy"
serviceName
=
"tiller-deploy"
)
// Uninstall uses kubernetes client to uninstall tiller
func
Uninstall
(
kubeClient
internalclientset
.
Interface
,
kubeCmd
*
kube
.
Client
,
opts
*
Options
)
error
{
if
_
,
err
:=
kubeClient
.
Core
()
.
Services
(
opts
.
Namespace
)
.
Get
(
"tiller-deploy"
);
err
!=
nil
{
if
!
kerrors
.
IsNotFound
(
err
)
{
func
Uninstall
(
client
internalclientset
.
Interface
,
opts
*
Options
)
error
{
if
err
:=
deleteService
(
client
.
Core
(),
opts
.
Namespace
);
err
!=
nil
{
return
err
}
}
else
if
err
:=
deleteService
(
kubeClient
.
Core
(),
opts
.
Namespace
);
err
!=
nil
{
return
err
}
if
obj
,
err
:=
kubeClient
.
Extensions
()
.
Deployments
(
opts
.
Namespace
)
.
Get
(
"tiller-deploy"
);
err
!=
nil
{
if
!
kerrors
.
IsNotFound
(
err
)
{
return
err
}
}
else
if
err
:=
deleteDeployment
(
kubeCmd
,
opts
.
Namespace
,
obj
);
err
!=
nil
{
return
err
}
return
nil
return
deleteDeployment
(
client
,
opts
.
Namespace
)
}
// deleteService deletes the Tiller Service resource
func
deleteService
(
client
internalversion
.
ServicesGetter
,
namespace
string
)
error
{
return
client
.
Services
(
namespace
)
.
Delete
(
"tiller-deploy"
,
&
api
.
DeleteOptions
{})
err
:=
client
.
Services
(
namespace
)
.
Delete
(
serviceName
,
&
metav1
.
DeleteOptions
{})
return
ingoreNotFound
(
err
)
}
// deleteDeployment deletes the Tiller Deployment resource
// We need to use the
kubeCmd
reaper instead of the kube API because GC for deployment dependents
// We need to use the reaper instead of the kube API because GC for deployment dependents
// is not yet supported at the k8s server level (<= 1.5)
func
deleteDeployment
(
kubeCmd
*
kube
.
Client
,
namespace
string
,
obj
*
extensions
.
Deployment
)
error
{
obj
.
Kind
=
"Deployment"
obj
.
APIVersion
=
"extensions/v1beta1"
buf
,
err
:=
yaml
.
Marshal
(
obj
)
if
err
!=
nil
{
return
err
}
reader
:=
strings
.
NewReader
(
string
(
buf
))
infos
,
err
:=
kubeCmd
.
Build
(
namespace
,
reader
)
if
err
!=
nil
{
return
err
}
for
_
,
info
:=
range
infos
{
reaper
,
err
:=
kubeCmd
.
Reaper
(
info
.
Mapping
)
if
err
!=
nil
{
return
err
func
deleteDeployment
(
client
internalclientset
.
Interface
,
namespace
string
)
error
{
reaper
,
_
:=
kubectl
.
ReaperFor
(
extensions
.
Kind
(
"Deployment"
),
client
)
err
:=
reaper
.
Stop
(
namespace
,
deploymentName
,
0
,
nil
)
return
ingoreNotFound
(
err
)
}
func
ingoreNotFound
(
err
error
)
error
{
if
apierrors
.
IsNotFound
(
err
)
{
return
nil
}
err
=
reaper
.
Stop
(
info
.
Namespace
,
info
.
Name
,
0
,
nil
)
if
err
!=
nil
{
return
err
}
}
return
nil
}
cmd/helm/installer/uninstall_test.go
View file @
85c41ef1
...
...
@@ -18,150 +18,55 @@ package installer // import "k8s.io/helm/cmd/helm/installer"
import
(
"testing"
"time"
apierrors
"k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
testcore
"k8s.io/client-go/testing"
"k8s.io/kubernetes/pkg/api"
apierrors
"k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake"
testcore
"k8s.io/kubernetes/pkg/client/testing/core"
"k8s.io/kubernetes/pkg/kubectl"
cmdtesting
"k8s.io/kubernetes/pkg/kubectl/cmd/testing"
cmdutil
"k8s.io/kubernetes/pkg/kubectl/cmd/util"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/helm/pkg/kube"
)
type
fakeReaper
struct
{
namespace
string
name
string
}
func
(
r
*
fakeReaper
)
Stop
(
namespace
,
name
string
,
timeout
time
.
Duration
,
gracePeriod
*
api
.
DeleteOptions
)
error
{
r
.
namespace
=
namespace
r
.
name
=
name
return
nil
}
type
fakeReaperFactory
struct
{
cmdutil
.
Factory
reaper
kubectl
.
Reaper
}
func
(
f
*
fakeReaperFactory
)
Reaper
(
mapping
*
meta
.
RESTMapping
)
(
kubectl
.
Reaper
,
error
)
{
return
f
.
reaper
,
nil
}
func
TestUninstall
(
t
*
testing
.
T
)
{
existingService
:=
service
(
api
.
NamespaceDefault
)
existingDeployment
:=
deployment
(
&
Options
{
Namespace
:
api
.
NamespaceDefault
,
ImageSpec
:
"image"
,
UseCanary
:
false
,
})
fc
:=
&
fake
.
Clientset
{}
fc
.
AddReactor
(
"get"
,
"services"
,
func
(
action
testcore
.
Action
)
(
bool
,
runtime
.
Object
,
error
)
{
return
true
,
existingService
,
nil
})
fc
.
AddReactor
(
"delete"
,
"services"
,
func
(
action
testcore
.
Action
)
(
bool
,
runtime
.
Object
,
error
)
{
return
true
,
nil
,
nil
})
fc
.
AddReactor
(
"get"
,
"deployments"
,
func
(
action
testcore
.
Action
)
(
bool
,
runtime
.
Object
,
error
)
{
return
true
,
existingDeployment
,
nil
})
f
,
_
,
_
,
_
:=
cmdtesting
.
NewAPIFactory
()
r
:=
&
fakeReaper
{}
rf
:=
&
fakeReaperFactory
{
Factory
:
f
,
reaper
:
r
}
kc
:=
&
kube
.
Client
{
Factory
:
rf
}
opts
:=
&
Options
{
Namespace
:
api
.
NamespaceDefault
}
if
err
:=
Uninstall
(
fc
,
kc
,
opts
);
err
!=
nil
{
if
err
:=
Uninstall
(
fc
,
opts
);
err
!=
nil
{
t
.
Errorf
(
"unexpected error: %#+v"
,
err
)
}
if
actions
:=
fc
.
Actions
();
len
(
actions
)
!=
3
{
t
.
Errorf
(
"unexpected actions: %v, expected 3 actions got %d"
,
actions
,
len
(
actions
))
}
if
r
.
namespace
!=
api
.
NamespaceDefault
{
t
.
Errorf
(
"unexpected reaper namespace: %s"
,
r
.
name
)
}
if
r
.
name
!=
"tiller-deploy"
{
t
.
Errorf
(
"unexpected reaper name: %s"
,
r
.
name
)
if
actions
:=
fc
.
Actions
();
len
(
actions
)
!=
6
{
t
.
Errorf
(
"unexpected actions: %v, expected 6 actions got %d"
,
actions
,
len
(
actions
))
}
}
func
TestUninstall_serviceNotFound
(
t
*
testing
.
T
)
{
existingDeployment
:=
deployment
(
&
Options
{
Namespace
:
api
.
NamespaceDefault
,
ImageSpec
:
"imageToReplace"
,
UseCanary
:
false
})
fc
:=
&
fake
.
Clientset
{}
fc
.
AddReactor
(
"get"
,
"services"
,
func
(
action
testcore
.
Action
)
(
bool
,
runtime
.
Object
,
error
)
{
return
true
,
nil
,
apierrors
.
NewNotFound
(
api
.
Resource
(
"services"
),
"1"
)
})
fc
.
AddReactor
(
"get"
,
"deployments"
,
func
(
action
testcore
.
Action
)
(
bool
,
runtime
.
Object
,
error
)
{
return
true
,
existingDeployment
,
nil
fc
.
AddReactor
(
"delete"
,
"services"
,
func
(
action
testcore
.
Action
)
(
bool
,
runtime
.
Object
,
error
)
{
return
true
,
nil
,
apierrors
.
NewNotFound
(
schema
.
GroupResource
{
Resource
:
"services"
},
"1"
)
})
f
,
_
,
_
,
_
:=
cmdtesting
.
NewAPIFactory
()
r
:=
&
fakeReaper
{}
rf
:=
&
fakeReaperFactory
{
Factory
:
f
,
reaper
:
r
}
kc
:=
&
kube
.
Client
{
Factory
:
rf
}
opts
:=
&
Options
{
Namespace
:
api
.
NamespaceDefault
}
if
err
:=
Uninstall
(
fc
,
kc
,
opts
);
err
!=
nil
{
if
err
:=
Uninstall
(
fc
,
opts
);
err
!=
nil
{
t
.
Errorf
(
"unexpected error: %#+v"
,
err
)
}
if
actions
:=
fc
.
Actions
();
len
(
actions
)
!=
2
{
t
.
Errorf
(
"unexpected actions: %v, expected 2 actions got %d"
,
actions
,
len
(
actions
))
}
if
r
.
namespace
!=
api
.
NamespaceDefault
{
t
.
Errorf
(
"unexpected reaper namespace: %s"
,
r
.
name
)
}
if
r
.
name
!=
"tiller-deploy"
{
t
.
Errorf
(
"unexpected reaper name: %s"
,
r
.
name
)
if
actions
:=
fc
.
Actions
();
len
(
actions
)
!=
6
{
t
.
Errorf
(
"unexpected actions: %v, expected 6 actions got %d"
,
actions
,
len
(
actions
))
}
}
func
TestUninstall_deploymentNotFound
(
t
*
testing
.
T
)
{
existingService
:=
service
(
api
.
NamespaceDefault
)
fc
:=
&
fake
.
Clientset
{}
fc
.
AddReactor
(
"get"
,
"services"
,
func
(
action
testcore
.
Action
)
(
bool
,
runtime
.
Object
,
error
)
{
return
true
,
existingService
,
nil
})
fc
.
AddReactor
(
"delete"
,
"services"
,
func
(
action
testcore
.
Action
)
(
bool
,
runtime
.
Object
,
error
)
{
return
true
,
nil
,
nil
})
fc
.
AddReactor
(
"get"
,
"deployments"
,
func
(
action
testcore
.
Action
)
(
bool
,
runtime
.
Object
,
error
)
{
fc
.
AddReactor
(
"delete"
,
"deployments"
,
func
(
action
testcore
.
Action
)
(
bool
,
runtime
.
Object
,
error
)
{
return
true
,
nil
,
apierrors
.
NewNotFound
(
api
.
Resource
(
"deployments"
),
"1"
)
})
f
,
_
,
_
,
_
:=
cmdtesting
.
NewAPIFactory
()
r
:=
&
fakeReaper
{}
rf
:=
&
fakeReaperFactory
{
Factory
:
f
,
reaper
:
r
}
kc
:=
&
kube
.
Client
{
Factory
:
rf
}
opts
:=
&
Options
{
Namespace
:
api
.
NamespaceDefault
}
if
err
:=
Uninstall
(
fc
,
kc
,
opts
);
err
!=
nil
{
if
err
:=
Uninstall
(
fc
,
opts
);
err
!=
nil
{
t
.
Errorf
(
"unexpected error: %#+v"
,
err
)
}
if
actions
:=
fc
.
Actions
();
len
(
actions
)
!=
3
{
t
.
Errorf
(
"unexpected actions: %v, expected 3 actions got %d"
,
actions
,
len
(
actions
))
}
if
r
.
namespace
!=
""
{
t
.
Errorf
(
"unexpected reaper namespace: %s"
,
r
.
name
)
}
if
r
.
name
!=
""
{
t
.
Errorf
(
"unexpected reaper name: %s"
,
r
.
name
)
if
actions
:=
fc
.
Actions
();
len
(
actions
)
!=
6
{
t
.
Errorf
(
"unexpected actions: %v, expected 6 actions got %d"
,
actions
,
len
(
actions
))
}
}
cmd/helm/reset.go
View file @
85c41ef1
...
...
@@ -28,7 +28,6 @@ import (
"k8s.io/helm/cmd/helm/installer"
"k8s.io/helm/pkg/helm"
"k8s.io/helm/pkg/helm/helmpath"
"k8s.io/helm/pkg/kube"
"k8s.io/helm/pkg/proto/hapi/release"
)
...
...
@@ -46,7 +45,6 @@ type resetCmd struct {
home
helmpath
.
Home
client
helm
.
Interface
kubeClient
internalclientset
.
Interface
kubeCmd
*
kube
.
Client
}
func
newResetCmd
(
client
helm
.
Interface
,
out
io
.
Writer
)
*
cobra
.
Command
{
...
...
@@ -89,9 +87,6 @@ func (d *resetCmd) run() error {
}
d
.
kubeClient
=
c
}
if
d
.
kubeCmd
==
nil
{
d
.
kubeCmd
=
getKubeCmd
(
kubeContext
)
}
res
,
err
:=
d
.
client
.
ListReleases
(
helm
.
ReleaseListStatuses
([]
release
.
Status_Code
{
release
.
Status_DEPLOYED
}),
...
...
@@ -104,7 +99,7 @@ func (d *resetCmd) run() error {
return
fmt
.
Errorf
(
"There are still %d deployed releases (Tip: use --force)."
,
len
(
res
.
Releases
))
}
if
err
:=
installer
.
Uninstall
(
d
.
kubeClient
,
d
.
kubeCmd
,
&
installer
.
Options
{
Namespace
:
d
.
namespace
});
err
!=
nil
{
if
err
:=
installer
.
Uninstall
(
d
.
kubeClient
,
&
installer
.
Options
{
Namespace
:
d
.
namespace
});
err
!=
nil
{
return
fmt
.
Errorf
(
"error unstalling Tiller: %s"
,
err
)
}
...
...
cmd/helm/reset_test.go
View file @
85c41ef1
...
...
@@ -54,12 +54,6 @@ func TestResetCmd(t *testing.T) {
if
len
(
actions
)
!=
2
{
t
.
Errorf
(
"Expected 2 actions, got %d"
,
len
(
actions
))
}
if
!
actions
[
0
]
.
Matches
(
"get"
,
"services"
)
{
t
.
Errorf
(
"unexpected action: %v, expected get service"
,
actions
[
1
])
}
if
!
actions
[
1
]
.
Matches
(
"get"
,
"deployments"
)
{
t
.
Errorf
(
"unexpected action: %v, expected get deployment"
,
actions
[
0
])
}
expected
:=
"Tiller (the helm server side component) has been uninstalled from your Kubernetes Cluster."
if
!
strings
.
Contains
(
buf
.
String
(),
expected
)
{
t
.
Errorf
(
"expected %q, got %q"
,
expected
,
buf
.
String
())
...
...
@@ -94,12 +88,6 @@ func TestResetCmd_removeHelmHome(t *testing.T) {
if
len
(
actions
)
!=
2
{
t
.
Errorf
(
"Expected 2 actions, got %d"
,
len
(
actions
))
}
if
!
actions
[
0
]
.
Matches
(
"get"
,
"services"
)
{
t
.
Errorf
(
"unexpected action: %v, expected get service"
,
actions
[
1
])
}
if
!
actions
[
1
]
.
Matches
(
"get"
,
"deployments"
)
{
t
.
Errorf
(
"unexpected action: %v, expected get deployment"
,
actions
[
0
])
}
expected
:=
"Tiller (the helm server side component) has been uninstalled from your Kubernetes Cluster."
if
!
strings
.
Contains
(
buf
.
String
(),
expected
)
{
t
.
Errorf
(
"expected %q, got %q"
,
expected
,
buf
.
String
())
...
...
@@ -171,12 +159,6 @@ func TestReset_forceFlag(t *testing.T) {
if
len
(
actions
)
!=
2
{
t
.
Errorf
(
"Expected 2 actions, got %d"
,
len
(
actions
))
}
if
!
actions
[
0
]
.
Matches
(
"get"
,
"services"
)
{
t
.
Errorf
(
"unexpected action: %v, expected get service"
,
actions
[
1
])
}
if
!
actions
[
1
]
.
Matches
(
"get"
,
"deployments"
)
{
t
.
Errorf
(
"unexpected action: %v, expected get deployment"
,
actions
[
0
])
}
expected
:=
"Tiller (the helm server side component) has been uninstalled from your Kubernetes Cluster."
if
!
strings
.
Contains
(
buf
.
String
(),
expected
)
{
t
.
Errorf
(
"expected %q, got %q"
,
expected
,
buf
.
String
())
...
...
glide.lock
View file @
85c41ef1
hash:
6a39d319e98b1b4305c48e9b718604b723184f27a1366efcedc42d95bcbeb0c8
updated: 2017-04-0
6T10:04:41.822904395
-07:00
hash:
49990f9ca1f3798070c44afc1c35657422125d3a03948856cc5f644020b1e3c2
updated: 2017-04-0
7T12:07:21.608950484
-07:00
imports:
- name: cloud.google.com/go
version: 3b1ae45394a234c385be014e9a488f2bb6eef821
...
...
@@ -14,10 +14,10 @@ imports:
version: 70b2c90b260171e829f1ebd7c17f600c11858dbe
subpackages:
- winterm
- name: github.com/
blang/semver
version:
31b736133b98f26d5e078ec9eb591666edfd091f
- name: github.com/
chai2010/gettext-go
version:
c6fed771bfd517099caf0f7a961671fa8ed08723
- name: github.com/coreos/go-oidc
version:
5644a2f50e2d2d5ba0b474bc5bc55fea1925936d
version:
be73733bb8cc830d0205609b95d125215f8e9c70
subpackages:
- http
- jose
...
...
@@ -27,8 +27,6 @@ imports:
- name: github.com/coreos/pkg
version: fa29b1d70f0beaddd4c7021607cc3c3be8ce94b8
subpackages:
- capnslog
- dlopen
- health
- httputil
- timeutil
...
...
@@ -82,18 +80,18 @@ imports:
- sockets
- tlsconfig
- name: github.com/docker/go-units
version:
0bbddae09c5a5419a8c6dcdd7ff90da3d450393b
version:
e30f1e79f3cd72542f2026ceec18d3bd67ab859c
- name: github.com/docker/spdystream
version: 449fdfce4d962303d702fec724ef0ad181c92528
subpackages:
- spdy
- name: github.com/emicklei/go-restful
version:
89ef8af493ab468a45a42bb0d89a06fccdd2fb
22
version:
09691a3b6378b740595c1002f40c34dd5f218a
22
subpackages:
- log
- swagger
- name: github.com/evanphx/json-patch
version:
465937c80b3c07a7c7ad20cc934898646a91c1de
version:
ba18e35c5c1b36ef6334cad706eb681153d2d379
- name: github.com/exponent-io/jsonpath
version: d6023ce2651d8eafb5c75bb0c7167536102ec9f5
- name: github.com/facebookgo/symwalk
...
...
@@ -121,31 +119,8 @@ imports:
- name: github.com/gogo/protobuf
version: e18d7aa8f8c624c915db340349aad4c49b10d173
subpackages:
- gogoproto
- plugin/compare
- plugin/defaultcheck
- plugin/description
- plugin/embedcheck
- plugin/enumstringer
- plugin/equal
- plugin/face
- plugin/gostring
- plugin/marshalto
- plugin/oneofcheck
- plugin/populate
- plugin/size
- plugin/stringer
- plugin/testgen
- plugin/union
- plugin/unmarshal
- proto
- protoc-gen-gogo/descriptor
- protoc-gen-gogo/generator
- protoc-gen-gogo/grpc
- protoc-gen-gogo/plugin
- sortkeys
- vanity
- vanity/command
- name: github.com/golang/glog
version: 44145f04b68cf362d9c4df2182967c2275eaefed
- name: github.com/golang/groupcache
...
...
@@ -159,7 +134,7 @@ imports:
- ptypes/any
- ptypes/timestamp
- name: github.com/google/gofuzz
version:
bbcb9da2d746f8bdbd6a936686a0a6067ada0ec5
version:
44d81051d367757e1c7c6a5a86423ece9afcf63c
- name: github.com/gosuri/uitable
version: 36ee7e946282a3fb1cfecd476ddc9b35d8847e42
subpackages:
...
...
@@ -216,16 +191,15 @@ imports:
subpackages:
- doc
- name: github.com/spf13/pflag
version:
5ccb023bc27df288a957c5e994cd44fd19619465
version:
9ff6c6923cfffbcd502984b8e0c80539a94968b7
- name: github.com/technosophos/moniker
version: 9f956786b91d9786ca11aa5be6104542fa911546
- name: github.com/ugorji/go
version:
f1f1a805ed361a0e078bb537e4ea78cd37dcf065
version:
ded73eae5db7e7a0ef6f55aace87a2873c5d2b74
subpackages:
- codec
- codec/codecgen
- name: golang.org/x/crypto
version:
1f22c0103821b9390939b6776727195525381532
version:
d172538b2cfce0c13cee31e647d0367aa8cd2486
subpackages:
- cast5
- openpgp
...
...
@@ -265,7 +239,12 @@ imports:
version: 2910a502d2bf9e43193af9d68ca516529614eed3
subpackages:
- cases
- encoding
- encoding/internal
- encoding/internal/identifier
- encoding/unicode
- internal/tag
- internal/utf8internal
- language
- runes
- secure/bidirule
...
...
@@ -301,67 +280,218 @@ imports:
version: 3887ee99ecf07df5b447e9b00d9c0b2adaa9f3e4
- name: gopkg.in/yaml.v2
version: a83829b6f1293c91addabc89d0571c246397bbf4
- name: k8s.io/apimachinery
version: 20e10d54608f05c3059443a6c0afb9979641e88d
subpackages:
- pkg/api/equality
- pkg/api/errors
- pkg/api/meta
- pkg/api/resource
- pkg/api/validation
- pkg/apimachinery
- pkg/apimachinery/announced
- pkg/apimachinery/registered
- pkg/apis/meta/v1
- pkg/apis/meta/v1/unstructured
- pkg/apis/meta/v1/validation
- pkg/conversion
- pkg/conversion/queryparams
- pkg/fields
- pkg/labels
- pkg/openapi
- pkg/runtime
- pkg/runtime/schema
- pkg/runtime/serializer
- pkg/runtime/serializer/json
- pkg/runtime/serializer/protobuf
- pkg/runtime/serializer/recognizer
- pkg/runtime/serializer/streaming
- pkg/runtime/serializer/versioning
- pkg/selection
- pkg/types
- pkg/util/diff
- pkg/util/errors
- pkg/util/framer
- pkg/util/httpstream
- pkg/util/httpstream/spdy
- pkg/util/intstr
- pkg/util/json
- pkg/util/mergepatch
- pkg/util/net
- pkg/util/rand
- pkg/util/runtime
- pkg/util/sets
- pkg/util/strategicpatch
- pkg/util/uuid
- pkg/util/validation
- pkg/util/validation/field
- pkg/util/wait
- pkg/util/yaml
- pkg/version
- pkg/watch
- third_party/forked/golang/json
- third_party/forked/golang/netutil
- third_party/forked/golang/reflect
- name: k8s.io/apiserver
version: dcf548fbe26dacc3a78d18e1135adf17006552e9
subpackages:
- pkg/authentication/authenticator
- pkg/authentication/serviceaccount
- pkg/authentication/user
- pkg/features
- pkg/server/httplog
- pkg/util/feature
- pkg/util/flag
- pkg/util/wsstream
- name: k8s.io/client-go
version: dabf37f5df16a224729883d9f616ce4a2c282e95
subpackages:
- discovery
- discovery/fake
- dynamic
- kubernetes
- kubernetes/scheme
- kubernetes/typed/apps/v1beta1
- kubernetes/typed/authentication/v1
- kubernetes/typed/authentication/v1beta1
- kubernetes/typed/authorization/v1
- kubernetes/typed/authorization/v1beta1
- kubernetes/typed/autoscaling/v1
- kubernetes/typed/autoscaling/v2alpha1
- kubernetes/typed/batch/v1
- kubernetes/typed/batch/v2alpha1
- kubernetes/typed/certificates/v1beta1
- kubernetes/typed/core/v1
- kubernetes/typed/extensions/v1beta1
- kubernetes/typed/policy/v1beta1
- kubernetes/typed/rbac/v1alpha1
- kubernetes/typed/rbac/v1beta1
- kubernetes/typed/settings/v1alpha1
- kubernetes/typed/storage/v1
- kubernetes/typed/storage/v1beta1
- pkg/api
- pkg/api/install
- pkg/api/v1
- pkg/apis/apps
- pkg/apis/apps/install
- pkg/apis/apps/v1beta1
- pkg/apis/authentication
- pkg/apis/authentication/install
- pkg/apis/authentication/v1
- pkg/apis/authentication/v1beta1
- pkg/apis/authorization
- pkg/apis/authorization/install
- pkg/apis/authorization/v1
- pkg/apis/authorization/v1beta1
- pkg/apis/autoscaling
- pkg/apis/autoscaling/install
- pkg/apis/autoscaling/v1
- pkg/apis/autoscaling/v2alpha1
- pkg/apis/batch
- pkg/apis/batch/install
- pkg/apis/batch/v1
- pkg/apis/batch/v2alpha1
- pkg/apis/certificates
- pkg/apis/certificates/install
- pkg/apis/certificates/v1beta1
- pkg/apis/extensions
- pkg/apis/extensions/install
- pkg/apis/extensions/v1beta1
- pkg/apis/policy
- pkg/apis/policy/install
- pkg/apis/policy/v1beta1
- pkg/apis/rbac
- pkg/apis/rbac/install
- pkg/apis/rbac/v1alpha1
- pkg/apis/rbac/v1beta1
- pkg/apis/settings
- pkg/apis/settings/install
- pkg/apis/settings/v1alpha1
- pkg/apis/storage
- pkg/apis/storage/install
- pkg/apis/storage/v1
- pkg/apis/storage/v1beta1
- pkg/util
- pkg/util/parsers
- pkg/version
- plugin/pkg/client/auth
- plugin/pkg/client/auth/gcp
- plugin/pkg/client/auth/oidc
- rest
- rest/fake
- rest/watch
- testing
- third_party/forked/golang/template
- tools/auth
- tools/cache
- tools/clientcmd
- tools/clientcmd/api
- tools/clientcmd/api/latest
- tools/clientcmd/api/v1
- tools/metrics
- tools/portforward
- tools/record
- transport
- util/cert
- util/clock
- util/flowcontrol
- util/homedir
- util/integer
- util/jsonpath
- name: k8s.io/kubernetes
version:
114f8911f9597be669a747ab72787e0bd74c9359
version:
b0b7a323cc5a4a2019b2e9520c21c7830b7f708e
subpackages:
- cmd/kubeadm/app/apis/kubeadm
- cmd/kubeadm/app/apis/kubeadm/install
- cmd/kubeadm/app/apis/kubeadm/v1alpha1
- federation/apis/federation
- federation/apis/federation/install
- federation/apis/federation/v1beta1
- federation/client/clientset_generated/federation_internalclientset
- federation/client/clientset_generated/federation_internalclientset/scheme
- federation/client/clientset_generated/federation_internalclientset/typed/autoscaling/internalversion
- federation/client/clientset_generated/federation_internalclientset/typed/batch/internalversion
- federation/client/clientset_generated/federation_internalclientset/typed/core/internalversion
- federation/client/clientset_generated/federation_internalclientset/typed/extensions/internalversion
- federation/client/clientset_generated/federation_internalclientset/typed/federation/internalversion
- pkg/api
- pkg/api/annotations
- pkg/api/endpoints
- pkg/api/errors
- pkg/api/events
- pkg/api/install
- pkg/api/meta
- pkg/api/meta/metatypes
- pkg/api/pod
- pkg/api/resource
- pkg/api/rest
- pkg/api/service
- pkg/api/testapi
- pkg/api/unversioned
- pkg/api/unversioned/validation
- pkg/api/util
- pkg/api/v1
- pkg/api/validation
- pkg/api/validation/path
- pkg/apimachinery
- pkg/apimachinery/announced
- pkg/apimachinery/registered
- pkg/apis/apps
- pkg/apis/apps/install
- pkg/apis/apps/v1beta1
- pkg/apis/authentication
- pkg/apis/authentication/install
- pkg/apis/authentication/v1
- pkg/apis/authentication/v1beta1
- pkg/apis/authorization
- pkg/apis/authorization/install
- pkg/apis/authorization/v1
- pkg/apis/authorization/v1beta1
- pkg/apis/autoscaling
- pkg/apis/autoscaling/install
- pkg/apis/autoscaling/v1
- pkg/apis/autoscaling/v2alpha1
- pkg/apis/batch
- pkg/apis/batch/install
- pkg/apis/batch/v1
- pkg/apis/batch/v2alpha1
- pkg/apis/certificates
- pkg/apis/certificates/install
- pkg/apis/certificates/v1
alph
a1
- pkg/apis/certificates/v1
bet
a1
- pkg/apis/componentconfig
- pkg/apis/componentconfig/install
- pkg/apis/componentconfig/v1alpha1
- pkg/apis/extensions
- pkg/apis/extensions/install
- pkg/apis/extensions/v1beta1
- pkg/apis/extensions/validation
- pkg/apis/imagepolicy
- pkg/apis/imagepolicy/install
- pkg/apis/imagepolicy/v1alpha1
...
...
@@ -371,16 +501,39 @@ imports:
- pkg/apis/rbac
- pkg/apis/rbac/install
- pkg/apis/rbac/v1alpha1
- pkg/apis/rbac/v1beta1
- pkg/apis/settings
- pkg/apis/settings/install
- pkg/apis/settings/v1alpha1
- pkg/apis/storage
- pkg/apis/storage/install
- pkg/apis/storage/util
- pkg/apis/storage/v1
- pkg/apis/storage/v1beta1
- pkg/auth/authenticator
- pkg/auth/user
- pkg/capabilities
- pkg/client/cache
- pkg/client/clientset_generated/clientset
- pkg/client/clientset_generated/clientset/scheme
- pkg/client/clientset_generated/clientset/typed/apps/v1beta1
- pkg/client/clientset_generated/clientset/typed/authentication/v1
- pkg/client/clientset_generated/clientset/typed/authentication/v1beta1
- pkg/client/clientset_generated/clientset/typed/authorization/v1
- pkg/client/clientset_generated/clientset/typed/authorization/v1beta1
- pkg/client/clientset_generated/clientset/typed/autoscaling/v1
- pkg/client/clientset_generated/clientset/typed/autoscaling/v2alpha1
- pkg/client/clientset_generated/clientset/typed/batch/v1
- pkg/client/clientset_generated/clientset/typed/batch/v2alpha1
- pkg/client/clientset_generated/clientset/typed/certificates/v1beta1
- pkg/client/clientset_generated/clientset/typed/core/v1
- pkg/client/clientset_generated/clientset/typed/extensions/v1beta1
- pkg/client/clientset_generated/clientset/typed/policy/v1beta1
- pkg/client/clientset_generated/clientset/typed/rbac/v1alpha1
- pkg/client/clientset_generated/clientset/typed/rbac/v1beta1
- pkg/client/clientset_generated/clientset/typed/settings/v1alpha1
- pkg/client/clientset_generated/clientset/typed/storage/v1
- pkg/client/clientset_generated/clientset/typed/storage/v1beta1
- pkg/client/clientset_generated/internalclientset
- pkg/client/clientset_generated/internalclientset/fake
- pkg/client/clientset_generated/internalclientset/scheme
- pkg/client/clientset_generated/internalclientset/typed/apps/internalversion
- pkg/client/clientset_generated/internalclientset/typed/apps/internalversion/fake
- pkg/client/clientset_generated/internalclientset/typed/authentication/internalversion
...
...
@@ -401,108 +554,51 @@ imports:
- pkg/client/clientset_generated/internalclientset/typed/policy/internalversion/fake
- pkg/client/clientset_generated/internalclientset/typed/rbac/internalversion
- pkg/client/clientset_generated/internalclientset/typed/rbac/internalversion/fake
- pkg/client/clientset_generated/internalclientset/typed/settings/internalversion
- pkg/client/clientset_generated/internalclientset/typed/settings/internalversion/fake
- pkg/client/clientset_generated/internalclientset/typed/storage/internalversion
- pkg/client/clientset_generated/internalclientset/typed/storage/internalversion/fake
- pkg/client/metrics
- pkg/client/record
- pkg/client/restclient
- pkg/client/restclient/fake
- pkg/client/listers/core/v1
- pkg/client/listers/extensions/v1beta1
- pkg/client/retry
- pkg/client/testing/core
- pkg/client/transport
- pkg/client/typed/discovery
- pkg/client/typed/discovery/fake
- pkg/client/typed/dynamic
- pkg/client/unversioned
- pkg/client/unversioned/auth
- pkg/client/unversioned/clientcmd
- pkg/client/unversioned/clientcmd/api
- pkg/client/unversioned/clientcmd/api/latest
- pkg/client/unversioned/clientcmd/api/v1
- pkg/client/unversioned/portforward
- pkg/client/unversioned/remotecommand
- pkg/controller
- pkg/controller/deployment/util
- pkg/conversion
- pkg/conversion/queryparams
- pkg/credentialprovider
- pkg/features
- pkg/fieldpath
- pkg/fields
- pkg/genericapiserver/openapi/common
- pkg/httplog
- pkg/kubectl
- pkg/kubectl/cmd/testing
- pkg/kubectl/cmd/util
- pkg/kubectl/resource
- pkg/kubelet/qos
- pkg/kubelet/server/portforward
- pkg/kubelet/server/remotecommand
- pkg/kubelet/types
- pkg/labels
- pkg/master/ports
- pkg/registry/extensions/thirdpartyresourcedata
- pkg/printers
- pkg/printers/internalversion
- pkg/runtime
- pkg/runtime/serializer
- pkg/runtime/serializer/json
- pkg/runtime/serializer/protobuf
- pkg/runtime/serializer/recognizer
- pkg/runtime/serializer/streaming
- pkg/runtime/serializer/versioning
- pkg/security/apparmor
- pkg/security/podsecuritypolicy/seccomp
- pkg/security/podsecuritypolicy/util
- pkg/selection
- pkg/serviceaccount
- pkg/storage
- pkg/types
- pkg/util
- pkg/util/cert
- pkg/util/clock
- pkg/util/config
- pkg/util/diff
- pkg/util/errors
- pkg/util/exec
- pkg/util/flag
- pkg/util/flowcontrol
- pkg/util/framer
- pkg/util/hash
- pkg/util/homedir
- pkg/util/httpstream
- pkg/util/httpstream/spdy
- pkg/util/integer
- pkg/util/interrupt
- pkg/util/intstr
- pkg/util/json
- pkg/util/jsonpath
- pkg/util/labels
- pkg/util/net
- pkg/util/net/sets
- pkg/util/node
- pkg/util/parsers
- pkg/util/pod
- pkg/util/rand
- pkg/util/runtime
- pkg/util/sets
- pkg/util/slice
- pkg/util/strategicpatch
- pkg/util/term
- pkg/util/uuid
- pkg/util/validation
- pkg/util/validation/field
- pkg/util/wait
- pkg/util/wsstream
- pkg/util/yaml
- pkg/version
- pkg/watch
- pkg/watch/json
- pkg/watch/versioned
- plugin/pkg/client/auth
- plugin/pkg/client/auth/gcp
- plugin/pkg/client/auth/oidc
- third_party/forked/golang/json
- third_party/forked/golang/netutil
- third_party/forked/golang/reflect
- third_party/forked/golang/template
- name: vbom.ml/util
version: db5cfe13f5cc80a4990d98e2e1b0707a4d1a5394
subpackages:
- sortorder
testImports:
- name: github.com/pmezard/go-difflib
version: d8ed2627bdf02c080bf22230dbb337003b7aba2d
...
...
glide.yaml
View file @
85c41ef1
...
...
@@ -7,7 +7,7 @@ import:
-
package
:
github.com/spf13/cobra
version
:
f62e98d28ab7ad31d707ba837a966378465c7b57
-
package
:
github.com/spf13/pflag
version
:
5ccb023bc27df288a957c5e994cd44fd19619465
version
:
9ff6c6923cfffbcd502984b8e0c80539a94968b7
-
package
:
github.com/Masterminds/vcs
version
:
~1.11.0
-
package
:
github.com/Masterminds/sprig
...
...
@@ -24,39 +24,10 @@ import:
-
ptypes/timestamp
-
package
:
google.golang.org/grpc
version
:
1.0.3
-
package
:
k8s.io/apimachinery
-
package
:
k8s.io/client-go
-
package
:
k8s.io/kubernetes
version
:
~1.5.0
subpackages
:
-
pkg/api
-
pkg/api/errors
-
pkg/api/meta
-
pkg/api/unversioned
-
pkg/api/v1
-
pkg/apis/apps/v1beta1
-
pkg/apis/batch
-
pkg/apis/batch/v1
-
pkg/apis/extensions
-
pkg/apis/extensions/v1beta1
-
pkg/client/clientset_generated/internalclientset
-
pkg/client/clientset_generated/internalclientset/typed/core/internalversion
-
pkg/client/clientset_generated/internalclientset/typed/extensions/internalversion
-
pkg/client/restclient
-
pkg/client/typed/discovery
-
pkg/client/unversioned
-
pkg/client/unversioned/clientcmd
-
pkg/client/unversioned/portforward
-
pkg/client/unversioned/remotecommand
-
pkg/fields
-
pkg/kubectl
-
pkg/kubectl/cmd/util
-
pkg/kubectl/resource
-
pkg/labels
-
pkg/runtime
-
pkg/util/intstr
-
pkg/util/strategicpatch
-
pkg/util/wait
-
pkg/version
-
pkg/watch
version
:
~1.6.0
-
package
:
github.com/gosuri/uitable
-
package
:
github.com/asaskevich/govalidator
version
:
^4.0.0
...
...
@@ -71,3 +42,9 @@ import:
version
:
~0.1.0
-
package
:
github.com/naoina/go-stringutil
version
:
~0.1.0
-
package
:
github.com/chai2010/gettext-go
testImports
:
-
package
:
github.com/stretchr/testify
version
:
^1.1.4
subpackages
:
-
assert
pkg/chartutil/capabilities.go
View file @
85c41ef1
...
...
@@ -16,8 +16,8 @@ limitations under the License.
package
chartutil
import
(
"k8s.io/apimachinery/pkg/version"
tversion
"k8s.io/helm/pkg/proto/hapi/version"
"k8s.io/kubernetes/pkg/version"
)
// DefaultVersionSet is the default version set, which includes only Core V1 ("v1").
...
...
pkg/chartutil/load.go
View file @
85c41ef1
...
...
@@ -22,13 +22,13 @@ import (
"compress/gzip"
"errors"
"fmt"
"github.com/facebookgo/symwalk"
"io"
"io/ioutil"
"os"
"path/filepath"
"strings"
"github.com/facebookgo/symwalk"
"github.com/golang/protobuf/ptypes/any"
"k8s.io/helm/pkg/ignore"
...
...
pkg/chartutil/values_test.go
View file @
85c41ef1
...
...
@@ -25,10 +25,10 @@ import (
"github.com/golang/protobuf/ptypes/any"
kversion
"k8s.io/apimachinery/pkg/version"
"k8s.io/helm/pkg/proto/hapi/chart"
"k8s.io/helm/pkg/timeconv"
"k8s.io/helm/pkg/version"
kversion
"k8s.io/kubernetes/pkg/version"
)
func
TestReadValues
(
t
*
testing
.
T
)
{
...
...
pkg/helm/portforwarder/portforwarder.go
View file @
85c41ef1
...
...
@@ -19,17 +19,18 @@ package portforwarder
import
(
"fmt"
metav1
"k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/client-go/rest"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion"
"k8s.io/kubernetes/pkg/client/restclient"
"k8s.io/kubernetes/pkg/labels"
"k8s.io/helm/pkg/kube"
)
// New creates a new and initialized tunnel.
func
New
(
namespace
string
,
client
*
internalclientset
.
Clientset
,
config
*
rest
client
.
Config
)
(
*
kube
.
Tunnel
,
error
)
{
func
New
(
namespace
string
,
client
*
internalclientset
.
Clientset
,
config
*
rest
.
Config
)
(
*
kube
.
Tunnel
,
error
)
{
podName
,
err
:=
getTillerPodName
(
client
.
Core
(),
namespace
)
if
err
!=
nil
{
return
nil
,
err
...
...
@@ -50,7 +51,7 @@ func getTillerPodName(client internalversion.PodsGetter, namespace string) (stri
}
func
getFirstRunningPod
(
client
internalversion
.
PodsGetter
,
namespace
string
,
selector
labels
.
Selector
)
(
*
api
.
Pod
,
error
)
{
options
:=
api
.
ListOptions
{
LabelSelector
:
selector
}
options
:=
metav1
.
ListOptions
{
LabelSelector
:
selector
.
String
()
}
pods
,
err
:=
client
.
Pods
(
namespace
)
.
List
(
options
)
if
err
!=
nil
{
return
nil
,
err
...
...
pkg/helm/portforwarder/portforwarder_test.go
View file @
85c41ef1
...
...
@@ -19,13 +19,14 @@ package portforwarder
import
(
"testing"
metav1
"k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake"
)
func
mockTillerPod
()
api
.
Pod
{
return
api
.
Pod
{
ObjectMeta
:
api
.
ObjectMeta
{
ObjectMeta
:
metav1
.
ObjectMeta
{
Name
:
"orca"
,
Namespace
:
api
.
NamespaceDefault
,
Labels
:
map
[
string
]
string
{
"app"
:
"helm"
,
"name"
:
"tiller"
},
...
...
pkg/kube/client.go
View file @
85c41ef1
...
...
@@ -27,28 +27,28 @@ import (
"time"
jsonpatch
"github.com/evanphx/json-patch"
"k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/api/meta"
metav1
"k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/fields"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/util/strategicpatch"
"k8s.io/apimachinery/pkg/watch"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/api/v1"
apps
"k8s.io/kubernetes/pkg/apis/apps/v1beta1"
batchinternal
"k8s.io/kubernetes/pkg/apis/batch"
batch
"k8s.io/kubernetes/pkg/apis/batch/v1"
ext
"k8s.io/kubernetes/pkg/apis/extensions"
extensions
"k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
"k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
conditions
"k8s.io/kubernetes/pkg/client/unversioned"
"k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
deploymentutil
"k8s.io/kubernetes/pkg/controller/deployment/util"
"k8s.io/kubernetes/pkg/fields"
"k8s.io/kubernetes/pkg/kubectl"
cmdutil
"k8s.io/kubernetes/pkg/kubectl/cmd/util"
"k8s.io/kubernetes/pkg/kubectl/resource"
"k8s.io/kubernetes/pkg/labels"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/util/strategicpatch"
"k8s.io/kubernetes/pkg/util/wait"
"k8s.io/kubernetes/pkg/watch"
"k8s.io/kubernetes/pkg/printers"
)
// ErrNoObjectsVisited indicates that during a visit operation, no matching objects were found.
...
...
@@ -61,12 +61,6 @@ type Client struct {
SchemaCacheDir
string
}
// deployment holds associated replicaSets for a deployment
type
deployment
struct
{
replicaSets
*
ext
.
ReplicaSet
deployment
*
ext
.
Deployment
}
// New create a new Client
func
New
(
config
clientcmd
.
ClientConfig
)
*
Client
{
return
&
Client
{
...
...
@@ -93,7 +87,7 @@ func (c *Client) Create(namespace string, reader io.Reader, timeout int64, shoul
if
buildErr
!=
nil
{
return
buildErr
}
if
err
:=
perform
(
c
,
namespace
,
infos
,
createResource
);
err
!=
nil
{
if
err
:=
perform
(
infos
,
createResource
);
err
!=
nil
{
return
err
}
if
shouldWait
{
...
...
@@ -130,7 +124,7 @@ func (c *Client) BuildUnstructured(namespace string, reader io.Reader) (Result,
return
nil
,
err
}
var
result
Result
result
,
err
=
resource
.
NewBuilder
(
mapper
,
typer
,
resource
.
ClientMapperFunc
(
c
.
UnstructuredClientForMapping
),
runtime
.
UnstructuredJSONScheme
)
.
result
,
err
=
resource
.
NewBuilder
(
mapper
,
typer
,
resource
.
ClientMapperFunc
(
c
.
UnstructuredClientForMapping
),
unstructured
.
UnstructuredJSONScheme
)
.
ContinueOnError
()
.
Schema
(
schema
)
.
NamespaceParam
(
namespace
)
.
...
...
@@ -160,25 +154,19 @@ func (c *Client) Get(namespace string, reader io.Reader) (string, error) {
return
""
,
err
}
missing
:=
[]
string
{}
err
=
perform
(
c
,
namespace
,
infos
,
func
(
info
*
resource
.
Info
)
error
{
err
=
perform
(
infos
,
func
(
info
*
resource
.
Info
)
error
{
log
.
Printf
(
"Doing get for %s: %q"
,
info
.
Mapping
.
GroupVersionKind
.
Kind
,
info
.
Name
)
obj
,
err
:=
resource
.
NewHelper
(
info
.
Client
,
info
.
Mapping
)
.
Get
(
info
.
Namespace
,
info
.
Name
,
info
.
Export
)
if
err
!=
nil
{
if
err
:=
info
.
Get
();
err
!=
nil
{
log
.
Printf
(
"WARNING: Failed Get for resource %q: %s"
,
info
.
Name
,
err
)
missing
=
append
(
missing
,
fmt
.
Sprintf
(
"%v
\t\t
%s"
,
info
.
Mapping
.
Resource
,
info
.
Name
))
return
nil
}
// We need to grab the ObjectReference so we can correctly group the objects.
or
,
err
:=
api
.
GetReference
(
obj
)
if
err
!=
nil
{
log
.
Printf
(
"FAILED GetReference for: %#v
\n
%v"
,
obj
,
err
)
return
err
}
// Use APIVersion/Kind as grouping mechanism. I'm not sure if you can have multiple
// versions per cluster, but this certainly won't hurt anything, so let's be safe.
objType
:=
or
.
APIVersion
+
"/"
+
or
.
Kind
objs
[
objType
]
=
append
(
objs
[
objType
],
obj
)
gvk
:=
info
.
ResourceMapping
()
.
GroupVersionKind
vk
:=
gvk
.
Version
+
"/"
+
gvk
.
Kind
objs
[
vk
]
=
append
(
objs
[
vk
],
info
.
Object
)
return
nil
})
if
err
!=
nil
{
...
...
@@ -190,7 +178,7 @@ func (c *Client) Get(namespace string, reader io.Reader) (string, error) {
// an object type changes, so we can just rely on that. Problem is it doesn't seem to keep
// track of tab widths
buf
:=
new
(
bytes
.
Buffer
)
p
:=
kubectl
.
NewHumanReadablePrinter
(
kubectl
.
PrintOptions
{})
p
,
_
:=
c
.
Printer
(
nil
,
printers
.
PrintOptions
{})
for
t
,
ot
:=
range
objs
{
if
_
,
err
=
buf
.
WriteString
(
"==> "
+
t
+
"
\n
"
);
err
!=
nil
{
return
""
,
err
...
...
@@ -294,7 +282,7 @@ func (c *Client) Delete(namespace string, reader io.Reader) error {
if
err
!=
nil
{
return
err
}
return
perform
(
c
,
namespace
,
infos
,
func
(
info
*
resource
.
Info
)
error
{
return
perform
(
infos
,
func
(
info
*
resource
.
Info
)
error
{
log
.
Printf
(
"Starting delete for %q %s"
,
info
.
Name
,
info
.
Mapping
.
GroupVersionKind
.
Kind
)
err
:=
deleteResource
(
c
,
info
)
return
skipIfNotFound
(
err
)
...
...
@@ -334,10 +322,10 @@ func (c *Client) WatchUntilReady(namespace string, reader io.Reader, timeout int
}
// For jobs, there's also the option to do poll c.Jobs(namespace).Get():
// https://github.com/adamreese/kubernetes/blob/master/test/e2e/job.go#L291-L300
return
perform
(
c
,
namespace
,
infos
,
watchTimeout
(
time
.
Duration
(
timeout
)
*
time
.
Second
))
return
perform
(
infos
,
watchTimeout
(
time
.
Duration
(
timeout
)
*
time
.
Second
))
}
func
perform
(
c
*
Client
,
namespace
string
,
infos
Result
,
fn
ResourceActorFunc
)
error
{
func
perform
(
infos
Result
,
fn
ResourceActorFunc
)
error
{
if
len
(
infos
)
==
0
{
return
ErrNoObjectsVisited
}
...
...
@@ -371,18 +359,18 @@ func deleteResource(c *Client, info *resource.Info) error {
return
reaper
.
Stop
(
info
.
Namespace
,
info
.
Name
,
0
,
nil
)
}
func
createPatch
(
mapping
*
meta
.
RESTMapping
,
target
,
current
runtime
.
Object
)
([]
byte
,
api
.
PatchType
,
error
)
{
func
createPatch
(
mapping
*
meta
.
RESTMapping
,
target
,
current
runtime
.
Object
)
([]
byte
,
types
.
PatchType
,
error
)
{
oldData
,
err
:=
json
.
Marshal
(
current
)
if
err
!=
nil
{
return
nil
,
api
.
StrategicMergePatchType
,
fmt
.
Errorf
(
"serializing current configuration: %s"
,
err
)
return
nil
,
types
.
StrategicMergePatchType
,
fmt
.
Errorf
(
"serializing current configuration: %s"
,
err
)
}
newData
,
err
:=
json
.
Marshal
(
target
)
if
err
!=
nil
{
return
nil
,
api
.
StrategicMergePatchType
,
fmt
.
Errorf
(
"serializing target configuration: %s"
,
err
)
return
nil
,
types
.
StrategicMergePatchType
,
fmt
.
Errorf
(
"serializing target configuration: %s"
,
err
)
}
if
api
.
Semantic
.
DeepEqual
(
oldData
,
newData
)
{
return
nil
,
api
.
StrategicMergePatchType
,
nil
return
nil
,
types
.
StrategicMergePatchType
,
nil
}
// Get a versioned object
...
...
@@ -391,13 +379,13 @@ func createPatch(mapping *meta.RESTMapping, target, current runtime.Object) ([]b
case
runtime
.
IsNotRegisteredError
(
err
)
:
// fall back to generic JSON merge patch
patch
,
err
:=
jsonpatch
.
CreateMergePatch
(
oldData
,
newData
)
return
patch
,
api
.
MergePatchType
,
err
return
patch
,
types
.
MergePatchType
,
err
case
err
!=
nil
:
return
nil
,
api
.
StrategicMergePatchType
,
fmt
.
Errorf
(
"failed to get versionedObject: %s"
,
err
)
return
nil
,
types
.
StrategicMergePatchType
,
fmt
.
Errorf
(
"failed to get versionedObject: %s"
,
err
)
default
:
log
.
Printf
(
"generating strategic merge patch for %T"
,
target
)
patch
,
err
:=
strategicpatch
.
CreateTwoWayMergePatch
(
oldData
,
newData
,
versionedObject
)
return
patch
,
api
.
StrategicMergePatchType
,
err
return
patch
,
types
.
StrategicMergePatchType
,
err
}
}
...
...
@@ -442,18 +430,36 @@ func updateResource(c *Client, target *resource.Info, currentObj runtime.Object,
return
nil
}
client
,
_
:=
c
.
ClientSet
()
return
recreatePods
(
client
,
target
.
Namespace
,
selector
)
pods
,
err
:=
client
.
Core
()
.
Pods
(
target
.
Namespace
)
.
List
(
metav1
.
ListOptions
{
FieldSelector
:
fields
.
Everything
()
.
String
(),
LabelSelector
:
labels
.
Set
(
selector
)
.
AsSelector
()
.
String
(),
})
if
err
!=
nil
{
return
err
}
// Restart pods
for
_
,
pod
:=
range
pods
.
Items
{
log
.
Printf
(
"Restarting pod: %v/%v"
,
pod
.
Namespace
,
pod
.
Name
)
// Delete each pod for get them restarted with changed spec.
if
err
:=
client
.
Core
()
.
Pods
(
pod
.
Namespace
)
.
Delete
(
pod
.
Name
,
metav1
.
NewPreconditionDeleteOptions
(
string
(
pod
.
UID
)));
err
!=
nil
{
return
err
}
}
return
nil
}
func
getSelectorFromObject
(
obj
runtime
.
Object
)
(
map
[
string
]
string
,
error
)
{
switch
typed
:=
obj
.
(
type
)
{
case
*
v1
.
ReplicationController
:
return
typed
.
Spec
.
Selector
,
nil
case
*
extensions
.
ReplicaSet
:
case
*
v1beta1
.
ReplicaSet
:
return
typed
.
Spec
.
Selector
.
MatchLabels
,
nil
case
*
extensions
.
Deployment
:
case
*
v1beta1
.
Deployment
:
return
typed
.
Spec
.
Selector
.
MatchLabels
,
nil
case
*
extensions
.
DaemonSet
:
case
*
v1beta1
.
DaemonSet
:
return
typed
.
Spec
.
Selector
.
MatchLabels
,
nil
case
*
batch
.
Job
:
return
typed
.
Spec
.
Selector
.
MatchLabels
,
nil
...
...
@@ -464,27 +470,6 @@ func getSelectorFromObject(obj runtime.Object) (map[string]string, error) {
}
}
func
recreatePods
(
client
*
internalclientset
.
Clientset
,
namespace
string
,
selector
map
[
string
]
string
)
error
{
pods
,
err
:=
client
.
Pods
(
namespace
)
.
List
(
api
.
ListOptions
{
FieldSelector
:
fields
.
Everything
(),
LabelSelector
:
labels
.
Set
(
selector
)
.
AsSelector
(),
})
if
err
!=
nil
{
return
err
}
// Restart pods
for
_
,
pod
:=
range
pods
.
Items
{
log
.
Printf
(
"Restarting pod: %v/%v"
,
pod
.
Namespace
,
pod
.
Name
)
// Delete each pod for get them restarted with changed spec.
if
err
:=
client
.
Pods
(
pod
.
Namespace
)
.
Delete
(
pod
.
Name
,
api
.
NewPreconditionDeleteOptions
(
string
(
pod
.
UID
)));
err
!=
nil
{
return
err
}
}
return
nil
}
func
watchUntilReady
(
timeout
time
.
Duration
,
info
*
resource
.
Info
)
error
{
w
,
err
:=
resource
.
NewHelper
(
info
.
Client
,
info
.
Mapping
)
.
WatchSingle
(
info
.
Namespace
,
info
.
Name
,
info
.
ResourceVersion
)
if
err
!=
nil
{
...
...
@@ -526,58 +511,9 @@ func watchUntilReady(timeout time.Duration, info *resource.Info) error {
return
err
}
func
podsReady
(
pods
[]
api
.
Pod
)
bool
{
for
_
,
pod
:=
range
pods
{
if
!
api
.
IsPodReady
(
&
pod
)
{
return
false
}
}
return
true
}
func
servicesReady
(
svc
[]
api
.
Service
)
bool
{
for
_
,
s
:=
range
svc
{
// Make sure the service is not explicitly set to "None" before checking the IP
if
s
.
Spec
.
ClusterIP
!=
api
.
ClusterIPNone
&&
!
api
.
IsServiceIPSet
(
&
s
)
{
return
false
}
// This checks if the service has a LoadBalancer and that balancer has an Ingress defined
if
s
.
Spec
.
Type
==
api
.
ServiceTypeLoadBalancer
&&
s
.
Status
.
LoadBalancer
.
Ingress
==
nil
{
return
false
}
}
return
true
}
func
volumesReady
(
vols
[]
api
.
PersistentVolumeClaim
)
bool
{
for
_
,
v
:=
range
vols
{
if
v
.
Status
.
Phase
!=
api
.
ClaimBound
{
return
false
}
}
return
true
}
func
deploymentsReady
(
deployments
[]
deployment
)
bool
{
for
_
,
v
:=
range
deployments
{
if
!
(
v
.
replicaSets
.
Status
.
ReadyReplicas
>=
v
.
deployment
.
Spec
.
Replicas
-
deploymentutil
.
MaxUnavailable
(
*
v
.
deployment
))
{
return
false
}
}
return
true
}
func
getPods
(
client
*
internalclientset
.
Clientset
,
namespace
string
,
selector
map
[
string
]
string
)
([]
api
.
Pod
,
error
)
{
list
,
err
:=
client
.
Pods
(
namespace
)
.
List
(
api
.
ListOptions
{
FieldSelector
:
fields
.
Everything
(),
LabelSelector
:
labels
.
Set
(
selector
)
.
AsSelector
(),
})
return
list
.
Items
,
err
}
// AsVersionedObject converts a runtime.object to a versioned object.
func
(
c
*
Client
)
AsVersionedObject
(
obj
runtime
.
Object
)
(
runtime
.
Object
,
error
)
{
json
,
err
:=
runtime
.
Encode
(
runtime
.
UnstructuredJSONScheme
,
obj
)
json
,
err
:=
runtime
.
Encode
(
unstructured
.
UnstructuredJSONScheme
,
obj
)
if
err
!=
nil
{
return
nil
,
err
}
...
...
@@ -586,99 +522,6 @@ func (c *Client) AsVersionedObject(obj runtime.Object) (runtime.Object, error) {
return
versions
.
First
(),
err
}
// waitForResources polls to get the current status of all pods, PVCs, and Services
// until all are ready or a timeout is reached
func
(
c
*
Client
)
waitForResources
(
timeout
time
.
Duration
,
created
Result
)
error
{
log
.
Printf
(
"beginning wait for resources with timeout of %v"
,
timeout
)
client
,
_
:=
c
.
ClientSet
()
return
wait
.
Poll
(
2
*
time
.
Second
,
timeout
,
func
()
(
bool
,
error
)
{
pods
:=
[]
api
.
Pod
{}
services
:=
[]
api
.
Service
{}
pvc
:=
[]
api
.
PersistentVolumeClaim
{}
replicaSets
:=
[]
*
ext
.
ReplicaSet
{}
deployments
:=
[]
deployment
{}
for
_
,
v
:=
range
created
{
obj
,
err
:=
c
.
AsVersionedObject
(
v
.
Object
)
if
err
!=
nil
&&
!
runtime
.
IsNotRegisteredError
(
err
)
{
return
false
,
err
}
switch
value
:=
obj
.
(
type
)
{
case
(
*
v1
.
ReplicationController
)
:
list
,
err
:=
getPods
(
client
,
value
.
Namespace
,
value
.
Spec
.
Selector
)
if
err
!=
nil
{
return
false
,
err
}
pods
=
append
(
pods
,
list
...
)
case
(
*
v1
.
Pod
)
:
pod
,
err
:=
client
.
Pods
(
value
.
Namespace
)
.
Get
(
value
.
Name
)
if
err
!=
nil
{
return
false
,
err
}
pods
=
append
(
pods
,
*
pod
)
case
(
*
extensions
.
Deployment
)
:
// Get the RS children first
rs
,
err
:=
client
.
ReplicaSets
(
value
.
Namespace
)
.
List
(
api
.
ListOptions
{
FieldSelector
:
fields
.
Everything
(),
LabelSelector
:
labels
.
Set
(
value
.
Spec
.
Selector
.
MatchLabels
)
.
AsSelector
(),
})
if
err
!=
nil
{
return
false
,
err
}
for
i
:=
range
rs
.
Items
{
replicaSets
=
append
(
replicaSets
,
&
rs
.
Items
[
i
])
}
currentDeployment
,
err
:=
client
.
Deployments
(
value
.
Namespace
)
.
Get
(
value
.
Name
)
if
err
!=
nil
{
return
false
,
err
}
// Find RS associated with deployment
newReplicaSet
,
err
:=
deploymentutil
.
FindNewReplicaSet
(
currentDeployment
,
replicaSets
)
if
err
!=
nil
{
return
false
,
err
}
newDeployment
:=
deployment
{
newReplicaSet
,
currentDeployment
,
}
deployments
=
append
(
deployments
,
newDeployment
)
case
(
*
extensions
.
DaemonSet
)
:
list
,
err
:=
getPods
(
client
,
value
.
Namespace
,
value
.
Spec
.
Selector
.
MatchLabels
)
if
err
!=
nil
{
return
false
,
err
}
pods
=
append
(
pods
,
list
...
)
case
(
*
apps
.
StatefulSet
)
:
list
,
err
:=
getPods
(
client
,
value
.
Namespace
,
value
.
Spec
.
Selector
.
MatchLabels
)
if
err
!=
nil
{
return
false
,
err
}
pods
=
append
(
pods
,
list
...
)
case
(
*
extensions
.
ReplicaSet
)
:
list
,
err
:=
getPods
(
client
,
value
.
Namespace
,
value
.
Spec
.
Selector
.
MatchLabels
)
if
err
!=
nil
{
return
false
,
err
}
pods
=
append
(
pods
,
list
...
)
case
(
*
v1
.
PersistentVolumeClaim
)
:
claim
,
err
:=
client
.
PersistentVolumeClaims
(
value
.
Namespace
)
.
Get
(
value
.
Name
)
if
err
!=
nil
{
return
false
,
err
}
pvc
=
append
(
pvc
,
*
claim
)
case
(
*
v1
.
Service
)
:
svc
,
err
:=
client
.
Services
(
value
.
Namespace
)
.
Get
(
value
.
Name
)
if
err
!=
nil
{
return
false
,
err
}
services
=
append
(
services
,
*
svc
)
}
}
return
podsReady
(
pods
)
&&
servicesReady
(
services
)
&&
volumesReady
(
pvc
)
&&
deploymentsReady
(
deployments
),
nil
})
}
// waitForJob is a helper that waits for a job to complete.
//
// This operates on an event returned from a watcher.
...
...
pkg/kube/client_test.go
View file @
85c41ef1
...
...
@@ -19,6 +19,7 @@ package kube
import
(
"bytes"
"encoding/json"
"fmt"
"io"
"io/ioutil"
"net/http"
...
...
@@ -26,19 +27,20 @@ import (
"testing"
"time"
"k8s.io/apimachinery/pkg/api/meta"
metav1
"k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/watch"
"k8s.io/client-go/dynamic"
"k8s.io/client-go/rest/fake"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/api/testapi"
"k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/api/validation"
"k8s.io/kubernetes/pkg/client/restclient/fake"
"k8s.io/kubernetes/pkg/kubectl"
cmdtesting
"k8s.io/kubernetes/pkg/kubectl/cmd/testing"
cmdutil
"k8s.io/kubernetes/pkg/kubectl/cmd/util"
"k8s.io/kubernetes/pkg/kubectl/resource"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/watch"
"k8s.io/kubernetes/pkg/printers"
watchjson
"k8s.io/kubernetes/pkg/watch/json"
)
...
...
@@ -56,7 +58,7 @@ func newPodWithStatus(name string, status api.PodStatus, namespace string) api.P
ns
=
namespace
}
return
api
.
Pod
{
ObjectMeta
:
api
.
ObjectMeta
{
ObjectMeta
:
metav1
.
ObjectMeta
{
Name
:
name
,
Namespace
:
ns
,
SelfLink
:
"/api/v1/namespaces/default/pods/"
+
name
,
...
...
@@ -80,13 +82,13 @@ func newPodList(names ...string) api.PodList {
return
list
}
func
notFoundBody
()
*
unversioned
.
Status
{
return
&
unversioned
.
Status
{
func
notFoundBody
()
*
metav1
.
Status
{
return
&
metav1
.
Status
{
Code
:
http
.
StatusNotFound
,
Status
:
unversioned
.
StatusFailure
,
Reason
:
unversioned
.
StatusReasonNotFound
,
Status
:
metav1
.
StatusFailure
,
Reason
:
metav1
.
StatusReasonNotFound
,
Message
:
"
\"\"
not found"
,
Details
:
&
unversioned
.
StatusDetails
{},
Details
:
&
metav1
.
StatusDetails
{},
}
}
...
...
@@ -101,7 +103,7 @@ type fakeReaper struct {
name
string
}
func
(
r
*
fakeReaper
)
Stop
(
namespace
,
name
string
,
timeout
time
.
Duration
,
gracePeriod
*
api
.
DeleteOptions
)
error
{
func
(
r
*
fakeReaper
)
Stop
(
namespace
,
name
string
,
timeout
time
.
Duration
,
gracePeriod
*
metav1
.
DeleteOptions
)
error
{
r
.
name
=
name
return
nil
}
...
...
@@ -124,7 +126,7 @@ func newEventResponse(code int, e *watch.Event) (*http.Response, error) {
header
:=
http
.
Header
{}
header
.
Set
(
"Content-Type"
,
runtime
.
ContentTypeJSON
)
body
:=
ioutil
.
NopCloser
(
bytes
.
NewReader
(
dispatchedEvent
))
return
&
http
.
Response
{
StatusCode
:
200
,
Header
:
header
,
Body
:
body
},
nil
return
&
http
.
Response
{
StatusCode
:
code
,
Header
:
header
,
Body
:
body
},
nil
}
func
encodeAndMarshalEvent
(
e
*
watch
.
Event
)
([]
byte
,
error
)
{
...
...
@@ -133,12 +135,7 @@ func encodeAndMarshalEvent(e *watch.Event) ([]byte, error) {
return
nil
,
err
}
marshaledEvent
,
err
:=
json
.
Marshal
(
encodedEvent
)
if
err
!=
nil
{
return
nil
,
err
}
return
marshaledEvent
,
nil
return
json
.
Marshal
(
encodedEvent
)
}
func
TestUpdate
(
t
*
testing
.
T
)
{
...
...
@@ -150,9 +147,10 @@ func TestUpdate(t *testing.T) {
var
actions
[]
string
f
,
tf
,
codec
,
ns
:=
cmdtesting
.
NewAPIFactory
()
tf
.
Client
=
&
fake
.
RESTClient
{
NegotiatedSerializer
:
ns
,
f
,
tf
,
codec
,
_
:=
cmdtesting
.
NewAPIFactory
()
tf
.
UnstructuredClient
=
&
fake
.
RESTClient
{
APIRegistry
:
api
.
Registry
,
NegotiatedSerializer
:
dynamic
.
ContentConfig
()
.
NegotiatedSerializer
,
Client
:
fake
.
CreateHTTPClient
(
func
(
req
*
http
.
Request
)
(
*
http
.
Response
,
error
)
{
p
,
m
:=
req
.
URL
.
Path
,
req
.
Method
actions
=
append
(
actions
,
p
+
":"
+
m
)
...
...
@@ -280,11 +278,33 @@ func TestBuild(t *testing.T) {
}
}
type
testPrinter
struct
{
Objects
[]
runtime
.
Object
Err
error
printers
.
ResourcePrinter
}
func
(
t
*
testPrinter
)
PrintObj
(
obj
runtime
.
Object
,
out
io
.
Writer
)
error
{
t
.
Objects
=
append
(
t
.
Objects
,
obj
)
fmt
.
Fprintf
(
out
,
"%#v"
,
obj
)
return
t
.
Err
}
func
(
t
*
testPrinter
)
HandledResources
()
[]
string
{
return
[]
string
{}
}
func
(
t
*
testPrinter
)
AfterPrint
(
io
.
Writer
,
string
)
error
{
return
t
.
Err
}
func
TestGet
(
t
*
testing
.
T
)
{
list
:=
newPodList
(
"starfish"
,
"otter"
)
f
,
tf
,
_
,
ns
:=
cmdtesting
.
NewAPIFactory
()
tf
.
Client
=
&
fake
.
RESTClient
{
NegotiatedSerializer
:
ns
,
f
,
tf
,
_
,
_
:=
cmdtesting
.
NewAPIFactory
()
tf
.
Printer
=
&
testPrinter
{}
tf
.
UnstructuredClient
=
&
fake
.
RESTClient
{
APIRegistry
:
api
.
Registry
,
NegotiatedSerializer
:
dynamic
.
ContentConfig
()
.
NegotiatedSerializer
,
Client
:
fake
.
CreateHTTPClient
(
func
(
req
*
http
.
Request
)
(
*
http
.
Response
,
error
)
{
p
,
m
:=
req
.
URL
.
Path
,
req
.
Method
//actions = append(actions, p+":"+m)
...
...
@@ -378,7 +398,7 @@ func TestPerform(t *testing.T) {
t
.
Errorf
(
"%q. Error while building manifests: %v"
,
tt
.
name
,
err
)
}
err
=
perform
(
c
,
tt
.
namespace
,
infos
,
fn
)
err
=
perform
(
infos
,
fn
)
if
(
err
!=
nil
)
!=
tt
.
err
{
t
.
Errorf
(
"%q. expected error: %v, got %v"
,
tt
.
name
,
tt
.
err
,
err
)
}
...
...
@@ -403,12 +423,12 @@ func TestWaitAndGetCompletedPodPhase(t *testing.T) {
podPhase
:
api
.
PodPending
,
expectedPhase
:
api
.
PodUnknown
,
err
:
true
,
errMessage
:
"
timed out waiting for the condition
"
,
errMessage
:
"
watch closed before Until timeout
"
,
},
{
podPhase
:
api
.
PodRunning
,
expectedPhase
:
api
.
PodUnknown
,
err
:
true
,
errMessage
:
"
timed out waiting for the condition
"
,
errMessage
:
"
watch closed before Until timeout
"
,
},
{
podPhase
:
api
.
PodSucceeded
,
expectedPhase
:
api
.
PodSucceeded
,
...
...
@@ -426,6 +446,7 @@ func TestWaitAndGetCompletedPodPhase(t *testing.T) {
testPodList
.
Items
=
append
(
testPodList
.
Items
,
newPodWithStatus
(
"bestpod"
,
api
.
PodStatus
{
Phase
:
tt
.
podPhase
},
"test"
))
tf
.
Client
=
&
fake
.
RESTClient
{
APIRegistry
:
api
.
Registry
,
NegotiatedSerializer
:
ns
,
Client
:
fake
.
CreateHTTPClient
(
func
(
req
*
http
.
Request
)
(
*
http
.
Response
,
error
)
{
p
,
m
:=
req
.
URL
.
Path
,
req
.
Method
...
...
@@ -433,7 +454,7 @@ func TestWaitAndGetCompletedPodPhase(t *testing.T) {
switch
{
case
p
==
"/namespaces/test/pods/bestpod"
&&
m
==
"GET"
:
return
newResponse
(
200
,
&
testPodList
.
Items
[
0
])
case
p
==
"/
watch/namespaces/test/pods/bestpod
"
&&
m
==
"GET"
:
case
p
==
"/
namespaces/test/pods
"
&&
m
==
"GET"
:
event
:=
watch
.
Event
{
Type
:
watch
.
Added
,
Object
:
&
testPodList
.
Items
[
0
]}
return
newEventResponse
(
200
,
&
event
)
default
:
...
...
pkg/kube/config.go
View file @
85c41ef1
...
...
@@ -16,7 +16,7 @@ limitations under the License.
package
kube
// import "k8s.io/helm/pkg/kube"
import
"k8s.io/
kubernetes/pkg/client/unversioned
/clientcmd"
import
"k8s.io/
client-go/tools
/clientcmd"
// GetConfig returns a kubernetes client config for a given context.
func
GetConfig
(
context
string
)
clientcmd
.
ClientConfig
{
...
...
pkg/kube/namespace.go
View file @
85c41ef1
...
...
@@ -17,14 +17,15 @@ limitations under the License.
package
kube
// import "k8s.io/helm/pkg/kube"
import
(
"k8s.io/apimachinery/pkg/api/errors"
metav1
"k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
)
func
createNamespace
(
client
internalclientset
.
Interface
,
namespace
string
)
error
{
ns
:=
&
api
.
Namespace
{
ObjectMeta
:
api
.
ObjectMeta
{
ObjectMeta
:
metav1
.
ObjectMeta
{
Name
:
namespace
,
},
}
...
...
@@ -33,7 +34,7 @@ func createNamespace(client internalclientset.Interface, namespace string) error
}
func
getNamespace
(
client
internalclientset
.
Interface
,
namespace
string
)
(
*
api
.
Namespace
,
error
)
{
return
client
.
Core
()
.
Namespaces
()
.
Get
(
namespace
)
return
client
.
Core
()
.
Namespaces
()
.
Get
(
namespace
,
metav1
.
GetOptions
{}
)
}
func
ensureNamespace
(
client
internalclientset
.
Interface
,
namespace
string
)
error
{
...
...
pkg/kube/namespace_test.go
View file @
85c41ef1
...
...
@@ -19,6 +19,7 @@ package kube // import "k8s.io/helm/pkg/kube"
import
(
"testing"
metav1
"k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake"
)
...
...
@@ -30,7 +31,7 @@ func TestEnsureNamespace(t *testing.T) {
if
err
:=
ensureNamespace
(
client
,
"foo"
);
err
!=
nil
{
t
.
Fatalf
(
"unexpected error: %s"
,
err
)
}
if
_
,
err
:=
client
.
Core
()
.
Namespaces
()
.
Get
(
"foo"
);
err
!=
nil
{
if
_
,
err
:=
client
.
Core
()
.
Namespaces
()
.
Get
(
"foo"
,
metav1
.
GetOptions
{}
);
err
!=
nil
{
t
.
Fatalf
(
"unexpected error: %s"
,
err
)
}
}
pkg/kube/result_test.go
View file @
85c41ef1
...
...
@@ -19,13 +19,13 @@ package kube // import "k8s.io/helm/pkg/kube"
import
(
"testing"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/kubernetes/pkg/api/testapi"
"k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/kubectl/resource"
)
func
TestResult
(
t
*
testing
.
T
)
{
mapping
,
err
:=
testapi
.
Default
.
RESTMapper
()
.
RESTMapping
(
unversioned
.
GroupKind
{
Kind
:
"Pod"
})
mapping
,
err
:=
testapi
.
Default
.
RESTMapper
()
.
RESTMapping
(
schema
.
GroupKind
{
Kind
:
"Pod"
})
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
...
...
pkg/kube/tunnel.go
View file @
85c41ef1
...
...
@@ -23,8 +23,8 @@ import (
"net"
"strconv"
"k8s.io/
kubernetes/pkg/client/restclien
t"
"k8s.io/
kubernetes/pkg/client/unversioned
/portforward"
"k8s.io/
client-go/res
t"
"k8s.io/
client-go/tools
/portforward"
"k8s.io/kubernetes/pkg/client/unversioned/remotecommand"
)
...
...
@@ -37,12 +37,12 @@ type Tunnel struct {
Out
io
.
Writer
stopChan
chan
struct
{}
readyChan
chan
struct
{}
config
*
rest
client
.
Config
client
rest
client
.
Interface
config
*
rest
.
Config
client
rest
.
Interface
}
// NewTunnel creates a new tunnel
func
NewTunnel
(
client
rest
client
.
Interface
,
config
*
restclien
t
.
Config
,
namespace
,
podName
string
,
remote
int
)
*
Tunnel
{
func
NewTunnel
(
client
rest
.
Interface
,
config
*
res
t
.
Config
,
namespace
,
podName
string
,
remote
int
)
*
Tunnel
{
return
&
Tunnel
{
config
:
config
,
client
:
client
,
...
...
pkg/kube/wait.go
0 → 100644
View file @
85c41ef1
/*
Copyright 2016 The Kubernetes Authors 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
kube
// import "k8s.io/helm/pkg/kube"
import
(
"log"
"time"
metav1
"k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/fields"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/client-go/pkg/apis/apps"
"k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
"k8s.io/kubernetes/pkg/client/clientset_generated/clientset"
core
"k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/core/v1"
extensions
"k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/extensions/v1beta1"
internalclientset
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
deploymentutil
"k8s.io/kubernetes/pkg/controller/deployment/util"
)
// deployment holds associated replicaSets for a deployment
type
deployment
struct
{
replicaSets
*
v1beta1
.
ReplicaSet
deployment
*
v1beta1
.
Deployment
}
// waitForResources polls to get the current status of all pods, PVCs, and Services
// until all are ready or a timeout is reached
func
(
c
*
Client
)
waitForResources
(
timeout
time
.
Duration
,
created
Result
)
error
{
log
.
Printf
(
"beginning wait for resources with timeout of %v"
,
timeout
)
cs
,
_
:=
c
.
ClientSet
()
client
:=
versionedClientsetForDeployment
(
cs
)
return
wait
.
Poll
(
2
*
time
.
Second
,
timeout
,
func
()
(
bool
,
error
)
{
pods
:=
[]
v1
.
Pod
{}
services
:=
[]
v1
.
Service
{}
pvc
:=
[]
v1
.
PersistentVolumeClaim
{}
replicaSets
:=
[]
*
v1beta1
.
ReplicaSet
{}
deployments
:=
[]
deployment
{}
for
_
,
v
:=
range
created
{
obj
,
err
:=
c
.
AsVersionedObject
(
v
.
Object
)
if
err
!=
nil
&&
!
runtime
.
IsNotRegisteredError
(
err
)
{
return
false
,
err
}
switch
value
:=
obj
.
(
type
)
{
case
(
*
v1
.
ReplicationController
)
:
list
,
err
:=
getPods
(
client
,
value
.
Namespace
,
value
.
Spec
.
Selector
)
if
err
!=
nil
{
return
false
,
err
}
pods
=
append
(
pods
,
list
...
)
case
(
*
v1
.
Pod
)
:
pod
,
err
:=
client
.
Core
()
.
Pods
(
value
.
Namespace
)
.
Get
(
value
.
Name
,
metav1
.
GetOptions
{})
if
err
!=
nil
{
return
false
,
err
}
pods
=
append
(
pods
,
*
pod
)
case
(
*
v1beta1
.
Deployment
)
:
// Get the RS children first
rs
,
err
:=
client
.
Extensions
()
.
ReplicaSets
(
value
.
Namespace
)
.
List
(
metav1
.
ListOptions
{
FieldSelector
:
fields
.
Everything
()
.
String
(),
LabelSelector
:
labels
.
Set
(
value
.
Spec
.
Selector
.
MatchLabels
)
.
AsSelector
()
.
String
(),
})
if
err
!=
nil
{
return
false
,
err
}
for
_
,
i
:=
range
rs
.
Items
{
replicaSets
=
append
(
replicaSets
,
&
i
)
}
currentDeployment
,
err
:=
client
.
Extensions
()
.
Deployments
(
value
.
Namespace
)
.
Get
(
value
.
Name
,
metav1
.
GetOptions
{})
if
err
!=
nil
{
return
false
,
err
}
// Find RS associated with deployment
newReplicaSet
,
err
:=
deploymentutil
.
FindNewReplicaSet
(
currentDeployment
,
replicaSets
)
if
err
!=
nil
{
return
false
,
err
}
newDeployment
:=
deployment
{
newReplicaSet
,
currentDeployment
,
}
deployments
=
append
(
deployments
,
newDeployment
)
case
(
*
v1beta1
.
DaemonSet
)
:
list
,
err
:=
getPods
(
client
,
value
.
Namespace
,
value
.
Spec
.
Selector
.
MatchLabels
)
if
err
!=
nil
{
return
false
,
err
}
pods
=
append
(
pods
,
list
...
)
case
(
*
apps
.
StatefulSet
)
:
list
,
err
:=
getPods
(
client
,
value
.
Namespace
,
value
.
Spec
.
Selector
.
MatchLabels
)
if
err
!=
nil
{
return
false
,
err
}
pods
=
append
(
pods
,
list
...
)
case
(
*
v1beta1
.
ReplicaSet
)
:
list
,
err
:=
getPods
(
client
,
value
.
Namespace
,
value
.
Spec
.
Selector
.
MatchLabels
)
if
err
!=
nil
{
return
false
,
err
}
pods
=
append
(
pods
,
list
...
)
case
(
*
v1
.
PersistentVolumeClaim
)
:
claim
,
err
:=
client
.
Core
()
.
PersistentVolumeClaims
(
value
.
Namespace
)
.
Get
(
value
.
Name
,
metav1
.
GetOptions
{})
if
err
!=
nil
{
return
false
,
err
}
pvc
=
append
(
pvc
,
*
claim
)
case
(
*
v1
.
Service
)
:
svc
,
err
:=
client
.
Core
()
.
Services
(
value
.
Namespace
)
.
Get
(
value
.
Name
,
metav1
.
GetOptions
{})
if
err
!=
nil
{
return
false
,
err
}
services
=
append
(
services
,
*
svc
)
}
}
return
podsReady
(
pods
)
&&
servicesReady
(
services
)
&&
volumesReady
(
pvc
)
&&
deploymentsReady
(
deployments
),
nil
})
}
func
podsReady
(
pods
[]
v1
.
Pod
)
bool
{
for
_
,
pod
:=
range
pods
{
if
!
v1
.
IsPodReady
(
&
pod
)
{
return
false
}
}
return
true
}
func
servicesReady
(
svc
[]
v1
.
Service
)
bool
{
for
_
,
s
:=
range
svc
{
// Make sure the service is not explicitly set to "None" before checking the IP
if
s
.
Spec
.
ClusterIP
!=
v1
.
ClusterIPNone
&&
!
v1
.
IsServiceIPSet
(
&
s
)
{
return
false
}
// This checks if the service has a LoadBalancer and that balancer has an Ingress defined
if
s
.
Spec
.
Type
==
v1
.
ServiceTypeLoadBalancer
&&
s
.
Status
.
LoadBalancer
.
Ingress
==
nil
{
return
false
}
}
return
true
}
func
volumesReady
(
vols
[]
v1
.
PersistentVolumeClaim
)
bool
{
for
_
,
v
:=
range
vols
{
if
v
.
Status
.
Phase
!=
v1
.
ClaimBound
{
return
false
}
}
return
true
}
func
deploymentsReady
(
deployments
[]
deployment
)
bool
{
for
_
,
v
:=
range
deployments
{
if
!
(
v
.
replicaSets
.
Status
.
ReadyReplicas
>=
*
v
.
deployment
.
Spec
.
Replicas
-
deploymentutil
.
MaxUnavailable
(
*
v
.
deployment
))
{
return
false
}
}
return
true
}
func
getPods
(
client
clientset
.
Interface
,
namespace
string
,
selector
map
[
string
]
string
)
([]
v1
.
Pod
,
error
)
{
list
,
err
:=
client
.
Core
()
.
Pods
(
namespace
)
.
List
(
metav1
.
ListOptions
{
FieldSelector
:
fields
.
Everything
()
.
String
(),
LabelSelector
:
labels
.
Set
(
selector
)
.
AsSelector
()
.
String
(),
})
return
list
.
Items
,
err
}
func
versionedClientsetForDeployment
(
internalClient
internalclientset
.
Interface
)
clientset
.
Interface
{
if
internalClient
==
nil
{
return
&
clientset
.
Clientset
{}
}
return
&
clientset
.
Clientset
{
CoreV1Client
:
core
.
New
(
internalClient
.
Core
()
.
RESTClient
()),
ExtensionsV1beta1Client
:
extensions
.
New
(
internalClient
.
Extensions
()
.
RESTClient
()),
}
}
pkg/releaseutil/filter_test.go
View file @
85c41ef1
...
...
@@ -17,8 +17,9 @@ limitations under the License.
package
releaseutil
// import "k8s.io/helm/pkg/releaseutil"
import
(
rspb
"k8s.io/helm/pkg/proto/hapi/release"
"testing"
rspb
"k8s.io/helm/pkg/proto/hapi/release"
)
func
TestFilterAny
(
t
*
testing
.
T
)
{
...
...
pkg/releaseutil/sorter_test.go
View file @
85c41ef1
...
...
@@ -17,10 +17,11 @@ limitations under the License.
package
releaseutil
// import "k8s.io/helm/pkg/releaseutil"
import
(
rspb
"k8s.io/helm/pkg/proto/hapi/release"
"k8s.io/helm/pkg/timeconv"
"testing"
"time"
rspb
"k8s.io/helm/pkg/proto/hapi/release"
"k8s.io/helm/pkg/timeconv"
)
// note: this test data is shared with filter_test.go.
...
...
pkg/storage/driver/cfgmaps.go
View file @
85c41ef1
...
...
@@ -28,11 +28,12 @@ import (
"time"
"github.com/golang/protobuf/proto"
apierrors
"k8s.io/apimachinery/pkg/api/errors"
metav1
"k8s.io/apimachinery/pkg/apis/meta/v1"
kblabels
"k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/util/validation"
"k8s.io/kubernetes/pkg/api"
kberrs
"k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion"
kblabels
"k8s.io/kubernetes/pkg/labels"
"k8s.io/kubernetes/pkg/util/validation"
rspb
"k8s.io/helm/pkg/proto/hapi/release"
)
...
...
@@ -67,9 +68,9 @@ func (cfgmaps *ConfigMaps) Name() string {
// or error if not found.
func
(
cfgmaps
*
ConfigMaps
)
Get
(
key
string
)
(
*
rspb
.
Release
,
error
)
{
// fetch the configmap holding the release named by key
obj
,
err
:=
cfgmaps
.
impl
.
Get
(
key
)
obj
,
err
:=
cfgmaps
.
impl
.
Get
(
key
,
metav1
.
GetOptions
{}
)
if
err
!=
nil
{
if
kber
rs
.
IsNotFound
(
err
)
{
if
apierro
rs
.
IsNotFound
(
err
)
{
return
nil
,
ErrReleaseNotFound
(
key
)
}
...
...
@@ -91,7 +92,7 @@ func (cfgmaps *ConfigMaps) Get(key string) (*rspb.Release, error) {
// configmap fails to retrieve the releases.
func
(
cfgmaps
*
ConfigMaps
)
List
(
filter
func
(
*
rspb
.
Release
)
bool
)
([]
*
rspb
.
Release
,
error
)
{
lsel
:=
kblabels
.
Set
{
"OWNER"
:
"TILLER"
}
.
AsSelector
()
opts
:=
api
.
ListOptions
{
LabelSelector
:
lsel
}
opts
:=
metav1
.
ListOptions
{
LabelSelector
:
lsel
.
String
()
}
list
,
err
:=
cfgmaps
.
impl
.
List
(
opts
)
if
err
!=
nil
{
...
...
@@ -127,7 +128,7 @@ func (cfgmaps *ConfigMaps) Query(labels map[string]string) ([]*rspb.Release, err
ls
[
k
]
=
v
}
opts
:=
api
.
ListOptions
{
LabelSelector
:
ls
.
AsSelector
()}
opts
:=
metav1
.
ListOptions
{
LabelSelector
:
ls
.
AsSelector
()
.
String
()}
list
,
err
:=
cfgmaps
.
impl
.
List
(
opts
)
if
err
!=
nil
{
...
...
@@ -168,7 +169,7 @@ func (cfgmaps *ConfigMaps) Create(key string, rls *rspb.Release) error {
}
// push the configmap object out into the kubiverse
if
_
,
err
:=
cfgmaps
.
impl
.
Create
(
obj
);
err
!=
nil
{
if
kber
rs
.
IsAlreadyExists
(
err
)
{
if
apierro
rs
.
IsAlreadyExists
(
err
)
{
return
ErrReleaseExists
(
rls
.
Name
)
}
...
...
@@ -206,15 +207,15 @@ func (cfgmaps *ConfigMaps) Update(key string, rls *rspb.Release) error {
func
(
cfgmaps
*
ConfigMaps
)
Delete
(
key
string
)
(
rls
*
rspb
.
Release
,
err
error
)
{
// fetch the release to check existence
if
rls
,
err
=
cfgmaps
.
Get
(
key
);
err
!=
nil
{
if
kber
rs
.
IsNotFound
(
err
)
{
return
nil
,
ErrRelease
NotFound
(
key
)
if
apierro
rs
.
IsNotFound
(
err
)
{
return
nil
,
ErrRelease
Exists
(
rls
.
Name
)
}
logerrf
(
err
,
"delete: failed to get release %q"
,
key
)
return
nil
,
err
}
// delete the release
if
err
=
cfgmaps
.
impl
.
Delete
(
key
,
&
api
.
DeleteOptions
{});
err
!=
nil
{
if
err
=
cfgmaps
.
impl
.
Delete
(
key
,
&
metav1
.
DeleteOptions
{});
err
!=
nil
{
return
rls
,
err
}
return
rls
,
nil
...
...
@@ -254,7 +255,7 @@ func newConfigMapsObject(key string, rls *rspb.Release, lbs labels) (*api.Config
// create and return configmap object
return
&
api
.
ConfigMap
{
ObjectMeta
:
api
.
ObjectMeta
{
ObjectMeta
:
metav1
.
ObjectMeta
{
Name
:
key
,
Labels
:
lbs
.
toMap
(),
},
...
...
pkg/storage/driver/mock_test.go
View file @
85c41ef1
...
...
@@ -20,8 +20,9 @@ import (
"fmt"
"testing"
apierrors
"k8s.io/apimachinery/pkg/api/errors"
metav1
"k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/kubernetes/pkg/api"
kberrs
"k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion"
rspb
"k8s.io/helm/pkg/proto/hapi/release"
...
...
@@ -96,16 +97,16 @@ func (mock *MockConfigMapsInterface) Init(t *testing.T, releases ...*rspb.Releas
}
// Get returns the ConfigMap by name.
func
(
mock
*
MockConfigMapsInterface
)
Get
(
name
string
)
(
*
api
.
ConfigMap
,
error
)
{
func
(
mock
*
MockConfigMapsInterface
)
Get
(
name
string
,
options
metav1
.
GetOptions
)
(
*
api
.
ConfigMap
,
error
)
{
object
,
ok
:=
mock
.
objects
[
name
]
if
!
ok
{
return
nil
,
kber
rs
.
NewNotFound
(
api
.
Resource
(
"tests"
),
name
)
return
nil
,
apierro
rs
.
NewNotFound
(
api
.
Resource
(
"tests"
),
name
)
}
return
object
,
nil
}
// List returns the a of ConfigMaps.
func
(
mock
*
MockConfigMapsInterface
)
List
(
opts
api
.
ListOptions
)
(
*
api
.
ConfigMapList
,
error
)
{
func
(
mock
*
MockConfigMapsInterface
)
List
(
opts
metav1
.
ListOptions
)
(
*
api
.
ConfigMapList
,
error
)
{
var
list
api
.
ConfigMapList
for
_
,
cfgmap
:=
range
mock
.
objects
{
list
.
Items
=
append
(
list
.
Items
,
*
cfgmap
)
...
...
@@ -117,7 +118,7 @@ func (mock *MockConfigMapsInterface) List(opts api.ListOptions) (*api.ConfigMapL
func
(
mock
*
MockConfigMapsInterface
)
Create
(
cfgmap
*
api
.
ConfigMap
)
(
*
api
.
ConfigMap
,
error
)
{
name
:=
cfgmap
.
ObjectMeta
.
Name
if
object
,
ok
:=
mock
.
objects
[
name
];
ok
{
return
object
,
kber
rs
.
NewAlreadyExists
(
api
.
Resource
(
"tests"
),
name
)
return
object
,
apierro
rs
.
NewAlreadyExists
(
api
.
Resource
(
"tests"
),
name
)
}
mock
.
objects
[
name
]
=
cfgmap
return
cfgmap
,
nil
...
...
@@ -127,16 +128,16 @@ func (mock *MockConfigMapsInterface) Create(cfgmap *api.ConfigMap) (*api.ConfigM
func
(
mock
*
MockConfigMapsInterface
)
Update
(
cfgmap
*
api
.
ConfigMap
)
(
*
api
.
ConfigMap
,
error
)
{
name
:=
cfgmap
.
ObjectMeta
.
Name
if
_
,
ok
:=
mock
.
objects
[
name
];
!
ok
{
return
nil
,
kber
rs
.
NewNotFound
(
api
.
Resource
(
"tests"
),
name
)
return
nil
,
apierro
rs
.
NewNotFound
(
api
.
Resource
(
"tests"
),
name
)
}
mock
.
objects
[
name
]
=
cfgmap
return
cfgmap
,
nil
}
// Delete deletes a ConfigMap by name.
func
(
mock
*
MockConfigMapsInterface
)
Delete
(
name
string
,
opts
*
api
.
DeleteOptions
)
error
{
func
(
mock
*
MockConfigMapsInterface
)
Delete
(
name
string
,
opts
*
metav1
.
DeleteOptions
)
error
{
if
_
,
ok
:=
mock
.
objects
[
name
];
!
ok
{
return
kber
rs
.
NewNotFound
(
api
.
Resource
(
"tests"
),
name
)
return
apierro
rs
.
NewNotFound
(
api
.
Resource
(
"tests"
),
name
)
}
delete
(
mock
.
objects
,
name
)
return
nil
...
...
pkg/tiller/release_server.go
View file @
85c41ef1
...
...
@@ -27,9 +27,9 @@ import (
"github.com/technosophos/moniker"
ctx
"golang.org/x/net/context"
"k8s.io/kubernetes/pkg/api/unversioned"
metav1
"k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/discovery"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
"k8s.io/kubernetes/pkg/client/typed/discovery"
"k8s.io/helm/pkg/chartutil"
"k8s.io/helm/pkg/hooks"
...
...
@@ -771,7 +771,7 @@ func getVersionSet(client discovery.ServerGroupsInterface) (chartutil.VersionSet
return
chartutil
.
DefaultVersionSet
,
nil
}
versions
:=
unversioned
.
ExtractGroupVersions
(
groups
)
versions
:=
metav1
.
ExtractGroupVersions
(
groups
)
return
chartutil
.
NewVersionSet
(
versions
...
),
nil
}
...
...
scripts/setup-apimachinery.sh
0 → 100755
View file @
85c41ef1
#!/usr/bin/env bash
# Copyright 2016 The Kubernetes Authors 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.
# Copies the current versions of apimachinery and client-go out of the
# main kubernetes repo. These repos are currently out of sync and not
# versioned.
set
-euo
pipefail
rm
-rf
./vendor/k8s.io/
{
kube-aggregator,apiserver,apimachinery,client-go
}
cp
-r
./vendor/k8s.io/kubernetes/staging/src/k8s.io/
{
kube-aggregator,apiserver,apimachinery,client-go
}
./vendor/k8s.io
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment