Skip to content
GitLab
Explore
Projects
Groups
Topics
Snippets
Projects
Groups
Topics
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
1105 Внедрение механизмов обеспечения безопасности цепочки поставки программных проектов
Legacy
scanned-projects
helm
Commits
557db8c6
Commit
557db8c6
authored
8 years ago
by
Matt Butcher
Browse files
Options
Download
Patches
Plain Diff
feat(tiller): verify apiVersions before install
parent
64b73081
main
Release
add-codeql
dependabot/go_modules/github.com/docker/distribution-2.8.2incompatible
dependabot/go_modules/github.com/lib/pq-1.10.9
dependabot/go_modules/github.com/rubenv/sql-migrate-1.4.0
dependabot/go_modules/golang.org/x/crypto-0.9.0
dependabot/go_modules/golang.org/x/term-0.8.0
dependabot/go_modules/k8s.io/klog/v2-2.100.1
dev-v2
feat-v3/event-emitter-lua
kube-update-test
release-2.0
release-2.1
release-2.10
release-2.11
release-2.12
release-2.13
release-2.14
release-2.15
release-2.16
release-2.17
release-2.2
release-2.3
release-2.4
release-2.5
release-2.6
release-2.7
release-2.8
release-2.9
release-3.0
release-3.1
release-3.10
release-3.11
release-3.12
release-3.2
release-3.3
release-3.4
release-3.5
release-3.6
release-3.6.1
release-3.6.2
release-3.7
release-3.8
release-3.9
release-v3.0.0-beta.4
v3.12.0
v3.12.0-rc.1
v3.12.0-dev.1
v3.11.3
v3.11.2
v3.11.1
v3.11.0
v3.11.0-rc.2
v3.11.0-rc.1
v3.10.3
v3.10.2
v3.10.1
v3.10.0
v3.10.0-rc.1
v3.9.4
v3.9.3
v3.9.2
v3.9.1
v3.9.0
v3.9.0-rc.1
v3.8.2
v3.8.1
v3.8.0
v3.8.0-rc.2
v3.8.0-rc.1
v3.7.2
v3.7.1
v3.7.0
v3.7.0-rc.3
v3.7.0-rc.2
v3.7.0-rc.1
v3.6.3
v3.6.2
v3.6.1
v3.6.0
v3.6.0-rc.1
v3.5.4
v3.5.3
v3.5.2
v3.5.1
v3.5.0
v3.5.0-rc.2
v3.5.0-rc.1
v3.4.2
v3.4.1
v3.4.0
v3.4.0-rc.1
v3.3.4
v3.3.3
v3.3.2
v3.3.1
v3.3.0
v3.3.0-rc.2
v3.3.0-rc.1
v3.2.4
v3.2.3
v3.2.2
v3.2.1
v3.2.0
v3.2.0-rc.1
v3.1.3
v3.1.2
v3.1.1
v3.1.0
v3.1.0-rc.3
v3.1.0-rc.2
v3.1.0-rc.1
v3.0.3
v3.0.2
v3.0.1
v3.0.0
v3.0.0-rc.4
v3.0.0-rc.3
v3.0.0-rc.2
v3.0.0-rc.1
v3.0.0-beta.5
v3.0.0-beta.4
v3.0.0-beta.3
v3.0.0-beta.2
v3.0.0-beta.1
v3.0.0-alpha.2
v3.0.0-alpha.1
v2.17.0
v2.17.0-rc.1
v2.16.12
v2.16.11
v2.16.10
v2.16.9
v2.16.8
v2.16.7
v2.16.6
v2.16.5
v2.16.4
v2.16.3
v2.16.2
v2.16.1
v2.16.0
v2.16.0-rc.2
v2.16.0-rc.1
v2.15.2
v2.15.1
v2.15.0
v2.15.0-rc.2
v2.15.0-rc.1
v2.14.3
v2.14.2
v2.14.1
v2.14.0
v2.14.0-rc.2
v2.14.0-rc.1
v2.13.1
v2.13.1-rc.1
v2.13.0
v2.13.0-rc.2
v2.13.0-rc.1
v2.12.3
v2.12.2
v2.12.1
v2.12.0
v2.12.0-rc.2
v2.12.0-rc.1
v2.11.0
v2.11.0-rc.4
v2.11.0-rc.3
v2.11.0-rc.2
v2.11.0-rc.1
v2.10.0
v2.10.0-rc.3
v2.10.0-rc.2
v2.10.0-rc.1
v2.9.1
v2.9.0
v2.9.0-rc5
v2.9.0-rc4
v2.9.0-rc3
v2.9.0-rc2
v2.9.0-rc1
v2.8.2
v2.8.2-rc1
v2.8.1
v2.8.0
v2.8.0-rc.1
v2.7.2
v2.7.1
v2.7.0
v2.7.0-rc1
v2.6.2
v2.6.1
v2.6.0
v2.5.1
v2.5.0
v2.4.2
v2.4.1
v2.4.0
v2.3.1
v2.3.0
v2.2.3
v2.2.2
v2.2.1
v2.2.0
v2.1.3
v2.1.2
v2.1.1
v2.1.0
v2.0.2
v2.0.1
v2.0.0
v2.0.0-rc.2
v2.0.0-rc.1
v2.0.0-beta.2
v2.0.0-beta.1
v2.0.0-alpha.5
v2.0.0-alpha.4
No related merge requests found
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
cmd/tiller/environment/environment.go
+2
-2
cmd/tiller/environment/environment.go
cmd/tiller/hooks.go
+23
-2
cmd/tiller/hooks.go
cmd/tiller/hooks_test.go
+22
-2
cmd/tiller/hooks_test.go
cmd/tiller/release_server.go
+31
-1
cmd/tiller/release_server.go
cmd/tiller/release_server_test.go
+14
-0
cmd/tiller/release_server_test.go
with
92 additions
and
7 deletions
+92
-7
cmd/tiller/environment/environment.go
+
2
−
2
View file @
557db8c6
...
@@ -23,7 +23,6 @@ These dependencies are expressed as interfaces so that alternate implementations
...
@@ -23,7 +23,6 @@ These dependencies are expressed as interfaces so that alternate implementations
package
environment
package
environment
import
(
import
(
"errors"
"io"
"io"
"k8s.io/helm/pkg/chartutil"
"k8s.io/helm/pkg/chartutil"
...
@@ -33,6 +32,7 @@ import (
...
@@ -33,6 +32,7 @@ import (
"k8s.io/helm/pkg/storage"
"k8s.io/helm/pkg/storage"
"k8s.io/helm/pkg/storage/driver"
"k8s.io/helm/pkg/storage/driver"
"k8s.io/kubernetes/pkg/client/unversioned"
"k8s.io/kubernetes/pkg/client/unversioned"
"k8s.io/kubernetes/pkg/client/unversioned/testclient"
)
)
// TillerNamespace is the namespace tiller is running in.
// TillerNamespace is the namespace tiller is running in.
...
@@ -150,7 +150,7 @@ type PrintingKubeClient struct {
...
@@ -150,7 +150,7 @@ type PrintingKubeClient struct {
// The printing client does not have access to a Kubernetes client at all. So it
// The printing client does not have access to a Kubernetes client at all. So it
// will always return an error if the client is accessed.
// will always return an error if the client is accessed.
func
(
p
*
PrintingKubeClient
)
APIClient
()
(
unversioned
.
Interface
,
error
)
{
func
(
p
*
PrintingKubeClient
)
APIClient
()
(
unversioned
.
Interface
,
error
)
{
return
nil
,
errors
.
New
(
"no API client found"
)
return
testclient
.
NewSimpleFake
(),
nil
}
}
// Create prints the values of what would be created with a real KubeClient.
// Create prints the values of what would be created with a real KubeClient.
...
...
This diff is collapsed.
Click to expand it.
cmd/tiller/hooks.go
+
23
−
2
View file @
557db8c6
...
@@ -48,6 +48,7 @@ var events = map[string]release.Hook_Event{
...
@@ -48,6 +48,7 @@ var events = map[string]release.Hook_Event{
}
}
type
simpleHead
struct
{
type
simpleHead
struct
{
Version
string
`json:"apiVersion"`
Kind
string
`json:"kind,omitempty"`
Kind
string
`json:"kind,omitempty"`
Metadata
*
struct
{
Metadata
*
struct
{
Name
string
`json:"name"`
Name
string
`json:"name"`
...
@@ -55,7 +56,22 @@ type simpleHead struct {
...
@@ -55,7 +56,22 @@ type simpleHead struct {
}
`json:"metadata,omitempty"`
}
`json:"metadata,omitempty"`
}
}
// sortHooks takes a map of filename/YAML contents and sorts them into hook types.
type
versionSet
map
[
string
]
struct
{}
func
newVersionSet
(
apiVersions
...
string
)
versionSet
{
vs
:=
versionSet
{}
for
_
,
v
:=
range
apiVersions
{
vs
[
v
]
=
struct
{}{}
}
return
vs
}
func
(
v
versionSet
)
Has
(
apiVersion
string
)
bool
{
_
,
ok
:=
v
[
apiVersion
]
return
ok
}
// sortManifests takes a map of filename/YAML contents and sorts them into hook types.
//
//
// The resulting hooks struct will be populated with all of the generated hooks.
// The resulting hooks struct will be populated with all of the generated hooks.
// Any file that does not declare one of the hook types will be placed in the
// Any file that does not declare one of the hook types will be placed in the
...
@@ -64,6 +80,7 @@ type simpleHead struct {
...
@@ -64,6 +80,7 @@ type simpleHead struct {
// To determine hook type, this looks for a YAML structure like this:
// To determine hook type, this looks for a YAML structure like this:
//
//
// kind: SomeKind
// kind: SomeKind
// apiVersion: v1
// metadata:
// metadata:
// annotations:
// annotations:
// helm.sh/hook: pre-install
// helm.sh/hook: pre-install
...
@@ -75,7 +92,7 @@ type simpleHead struct {
...
@@ -75,7 +92,7 @@ type simpleHead struct {
//
//
// Files that do not parse into the expected format are simply placed into a map and
// Files that do not parse into the expected format are simply placed into a map and
// returned.
// returned.
func
sort
Hook
s
(
files
map
[
string
]
string
)
([]
*
release
.
Hook
,
map
[
string
]
string
,
error
)
{
func
sort
Manifest
s
(
files
map
[
string
]
string
,
apis
versionSet
)
([]
*
release
.
Hook
,
map
[
string
]
string
,
error
)
{
hs
:=
[]
*
release
.
Hook
{}
hs
:=
[]
*
release
.
Hook
{}
generic
:=
map
[
string
]
string
{}
generic
:=
map
[
string
]
string
{}
...
@@ -99,6 +116,10 @@ func sortHooks(files map[string]string) ([]*release.Hook, map[string]string, err
...
@@ -99,6 +116,10 @@ func sortHooks(files map[string]string) ([]*release.Hook, map[string]string, err
return
hs
,
generic
,
e
return
hs
,
generic
,
e
}
}
if
sh
.
Version
!=
""
&&
!
apis
.
Has
(
sh
.
Version
)
{
return
hs
,
generic
,
fmt
.
Errorf
(
"apiVersion %q in %s is not available"
,
sh
.
Version
,
n
)
}
if
sh
.
Metadata
==
nil
||
sh
.
Metadata
.
Annotations
==
nil
||
len
(
sh
.
Metadata
.
Annotations
)
==
0
{
if
sh
.
Metadata
==
nil
||
sh
.
Metadata
.
Annotations
==
nil
||
len
(
sh
.
Metadata
.
Annotations
)
==
0
{
generic
[
n
]
=
c
generic
[
n
]
=
c
continue
continue
...
...
This diff is collapsed.
Click to expand it.
cmd/tiller/hooks_test.go
+
22
−
2
View file @
557db8c6
...
@@ -22,7 +22,7 @@ import (
...
@@ -22,7 +22,7 @@ import (
"k8s.io/helm/pkg/proto/hapi/release"
"k8s.io/helm/pkg/proto/hapi/release"
)
)
func
TestSort
Hook
s
(
t
*
testing
.
T
)
{
func
TestSort
Manifest
s
(
t
*
testing
.
T
)
{
data
:=
[]
struct
{
data
:=
[]
struct
{
name
string
name
string
...
@@ -52,6 +52,7 @@ metadata:
...
@@ -52,6 +52,7 @@ metadata:
kind
:
"ReplicaSet"
,
kind
:
"ReplicaSet"
,
hooks
:
[]
release
.
Hook_Event
{
release
.
Hook_POST_INSTALL
},
hooks
:
[]
release
.
Hook_Event
{
release
.
Hook_POST_INSTALL
},
manifest
:
`kind: ReplicaSet
manifest
:
`kind: ReplicaSet
apiVersion: v1beta1
metadata:
metadata:
name: second
name: second
annotations:
annotations:
...
@@ -63,6 +64,7 @@ metadata:
...
@@ -63,6 +64,7 @@ metadata:
kind
:
"ReplicaSet"
,
kind
:
"ReplicaSet"
,
hooks
:
[]
release
.
Hook_Event
{},
hooks
:
[]
release
.
Hook_Event
{},
manifest
:
`kind: ReplicaSet
manifest
:
`kind: ReplicaSet
apiVersion: v1beta1
metadata:
metadata:
name: third
name: third
annotations:
annotations:
...
@@ -74,6 +76,7 @@ metadata:
...
@@ -74,6 +76,7 @@ metadata:
kind
:
"Pod"
,
kind
:
"Pod"
,
hooks
:
[]
release
.
Hook_Event
{},
hooks
:
[]
release
.
Hook_Event
{},
manifest
:
`kind: Pod
manifest
:
`kind: Pod
apiVersion: v1
metadata:
metadata:
name: fourth
name: fourth
annotations:
annotations:
...
@@ -85,6 +88,7 @@ metadata:
...
@@ -85,6 +88,7 @@ metadata:
kind
:
"ReplicaSet"
,
kind
:
"ReplicaSet"
,
hooks
:
[]
release
.
Hook_Event
{
release
.
Hook_POST_DELETE
,
release
.
Hook_POST_INSTALL
},
hooks
:
[]
release
.
Hook_Event
{
release
.
Hook_POST_DELETE
,
release
.
Hook_POST_INSTALL
},
manifest
:
`kind: ReplicaSet
manifest
:
`kind: ReplicaSet
apiVersion: v1beta1
metadata:
metadata:
name: fifth
name: fifth
annotations:
annotations:
...
@@ -112,7 +116,7 @@ metadata:
...
@@ -112,7 +116,7 @@ metadata:
manifests
[
o
.
path
]
=
o
.
manifest
manifests
[
o
.
path
]
=
o
.
manifest
}
}
hs
,
generic
,
err
:=
sort
Hook
s
(
manifests
)
hs
,
generic
,
err
:=
sort
Manifest
s
(
manifests
,
newVersionSet
(
"v1"
,
"v1beta1"
)
)
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Fatalf
(
"Unexpected error: %s"
,
err
)
t
.
Fatalf
(
"Unexpected error: %s"
,
err
)
}
}
...
@@ -153,3 +157,19 @@ metadata:
...
@@ -153,3 +157,19 @@ metadata:
}
}
}
}
func
TestVersionSet
(
t
*
testing
.
T
)
{
vs
:=
newVersionSet
(
"v1"
,
"v1beta1"
,
"extensions/alpha5"
,
"batch/v1"
)
if
l
:=
len
(
vs
);
l
!=
4
{
t
.
Errorf
(
"Expected 4, got %d"
,
l
)
}
if
!
vs
.
Has
(
"extensions/alpha5"
)
{
t
.
Error
(
"No match for alpha5"
)
}
if
vs
.
Has
(
"nosuch/extension"
)
{
t
.
Error
(
"Found nonexistent extension"
)
}
}
This diff is collapsed.
Click to expand it.
cmd/tiller/release_server.go
+
31
−
1
View file @
557db8c6
...
@@ -35,6 +35,7 @@ import (
...
@@ -35,6 +35,7 @@ import (
"k8s.io/helm/pkg/proto/hapi/services"
"k8s.io/helm/pkg/proto/hapi/services"
"k8s.io/helm/pkg/storage/driver"
"k8s.io/helm/pkg/storage/driver"
"k8s.io/helm/pkg/timeconv"
"k8s.io/helm/pkg/timeconv"
"k8s.io/kubernetes/pkg/api/unversioned"
)
)
var
srv
*
releaseServer
var
srv
*
releaseServer
...
@@ -399,6 +400,31 @@ func (s *releaseServer) prepareRelease(req *services.InstallReleaseRequest) (*re
...
@@ -399,6 +400,31 @@ func (s *releaseServer) prepareRelease(req *services.InstallReleaseRequest) (*re
return
rel
,
nil
return
rel
,
nil
}
}
func
(
s
*
releaseServer
)
getVersionSet
()
(
versionSet
,
error
)
{
defVersions
:=
newVersionSet
(
"v1"
)
cli
,
err
:=
s
.
env
.
KubeClient
.
APIClient
()
if
err
!=
nil
{
log
.
Printf
(
"API Client for Kubernetes is missing: %s."
,
err
)
return
defVersions
,
err
}
groups
,
err
:=
cli
.
Discovery
()
.
ServerGroups
()
if
err
!=
nil
{
return
defVersions
,
err
}
// FIXME: The Kubernetes test fixture for cli appears to always return nil
// for calls to Discovery().ServerGroups(). So in this case, we return
// the default API list. This is also a safe value to return in any other
// odd-ball case.
if
groups
==
nil
{
return
defVersions
,
nil
}
versions
:=
unversioned
.
ExtractGroupVersions
(
groups
)
return
newVersionSet
(
versions
...
),
nil
}
func
(
s
*
releaseServer
)
renderResources
(
ch
*
chart
.
Chart
,
values
chartutil
.
Values
)
([]
*
release
.
Hook
,
*
bytes
.
Buffer
,
error
)
{
func
(
s
*
releaseServer
)
renderResources
(
ch
*
chart
.
Chart
,
values
chartutil
.
Values
)
([]
*
release
.
Hook
,
*
bytes
.
Buffer
,
error
)
{
renderer
:=
s
.
engine
(
ch
)
renderer
:=
s
.
engine
(
ch
)
files
,
err
:=
renderer
.
Render
(
ch
,
values
)
files
,
err
:=
renderer
.
Render
(
ch
,
values
)
...
@@ -409,7 +435,11 @@ func (s *releaseServer) renderResources(ch *chart.Chart, values chartutil.Values
...
@@ -409,7 +435,11 @@ func (s *releaseServer) renderResources(ch *chart.Chart, values chartutil.Values
// Sort hooks, manifests, and partials. Only hooks and manifests are returned,
// Sort hooks, manifests, and partials. Only hooks and manifests are returned,
// as partials are not used after renderer.Render. Empty manifests are also
// as partials are not used after renderer.Render. Empty manifests are also
// removed here.
// removed here.
hooks
,
manifests
,
err
:=
sortHooks
(
files
)
vs
,
err
:=
s
.
getVersionSet
()
if
err
!=
nil
{
return
nil
,
nil
,
fmt
.
Errorf
(
"Could not get apiVersions from Kubernetes: %s"
,
err
)
}
hooks
,
manifests
,
err
:=
sortManifests
(
files
,
vs
)
if
err
!=
nil
{
if
err
!=
nil
{
// By catching parse errors here, we can prevent bogus releases from going
// By catching parse errors here, we can prevent bogus releases from going
// to Kubernetes.
// to Kubernetes.
...
...
This diff is collapsed.
Click to expand it.
cmd/tiller/release_server_test.go
+
14
−
0
View file @
557db8c6
...
@@ -108,6 +108,20 @@ func releaseStub() *release.Release {
...
@@ -108,6 +108,20 @@ func releaseStub() *release.Release {
}
}
}
}
func
TestGetVersionSet
(
t
*
testing
.
T
)
{
rs
:=
rsFixture
()
vs
,
err
:=
rs
.
getVersionSet
()
if
err
!=
nil
{
t
.
Error
(
err
)
}
if
!
vs
.
Has
(
"v1"
)
{
t
.
Errorf
(
"Expected supported versions to at least include v1."
)
}
if
vs
.
Has
(
"nosuchversion/v1"
)
{
t
.
Error
(
"Non-existent version is reported found."
)
}
}
func
TestUniqName
(
t
*
testing
.
T
)
{
func
TestUniqName
(
t
*
testing
.
T
)
{
rs
:=
rsFixture
()
rs
:=
rsFixture
()
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment
Menu
Explore
Projects
Groups
Topics
Snippets