Skip to content

Commit d1513e1

Browse files
Merge pull request #19149 from deads2k/up-29-components
make components for most cluster up add-ons
2 parents f7fe3b5 + 9c6070a commit d1513e1

File tree

11 files changed

+550
-506
lines changed

11 files changed

+550
-506
lines changed

pkg/oc/bootstrap/clusterup/components/registry/registry_install.go

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,20 @@ package registry
22

33
import (
44
"fmt"
5-
"os"
5+
"io/ioutil"
66
"path"
77

88
"github.com/golang/glog"
99

1010
apierrors "k8s.io/apimachinery/pkg/api/errors"
1111
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
12+
"k8s.io/apiserver/pkg/authentication/serviceaccount"
1213
"k8s.io/client-go/kubernetes"
13-
"k8s.io/client-go/rest"
14+
kclientcmd "k8s.io/client-go/tools/clientcmd"
15+
"k8s.io/client-go/util/retry"
1416

1517
"github.com/openshift/origin/pkg/oc/bootstrap/clusterup/componentinstall"
1618
"github.com/openshift/origin/pkg/oc/bootstrap/docker/dockerhelper"
17-
"github.com/openshift/origin/pkg/oc/bootstrap/docker/openshift"
1819
"github.com/openshift/origin/pkg/oc/bootstrap/docker/run"
1920
"github.com/openshift/origin/pkg/oc/errors"
2021
securityclient "github.com/openshift/origin/pkg/security/generated/internalclientset/typed/security/internalversion"
@@ -29,8 +30,6 @@ const (
2930
)
3031

3132
type RegistryComponentOptions struct {
32-
ClusterAdminKubeConfig *rest.Config
33-
3433
OCImage string
3534
MasterConfigDir string
3635
Images string
@@ -42,7 +41,15 @@ func (r *RegistryComponentOptions) Name() string {
4241
}
4342

4443
func (r *RegistryComponentOptions) Install(dockerClient dockerhelper.Interface, logdir string) error {
45-
kubeClient, err := kubernetes.NewForConfig(r.ClusterAdminKubeConfig)
44+
clusterAdminKubeConfigBytes, err := ioutil.ReadFile(path.Join(r.MasterConfigDir, "admin.kubeconfig"))
45+
if err != nil {
46+
return err
47+
}
48+
restConfig, err := kclientcmd.RESTConfigFromKubeConfig(clusterAdminKubeConfigBytes)
49+
if err != nil {
50+
return err
51+
}
52+
kubeClient, err := kubernetes.NewForConfig(restConfig)
4653
_, err = kubeClient.Core().Services(DefaultNamespace).Get(SvcDockerRegistry, metav1.GetOptions{})
4754
if err == nil {
4855
// If there's no error, the registry already exists
@@ -55,13 +62,24 @@ func (r *RegistryComponentOptions) Install(dockerClient dockerhelper.Interface,
5562
imageRunHelper := run.NewRunHelper(dockerhelper.NewHelper(dockerClient)).New()
5663
glog.Infof("Running %q", r.Name())
5764

58-
securityClient, err := securityclient.NewForConfig(r.ClusterAdminKubeConfig)
59-
if err != nil {
60-
return err
61-
}
62-
err = openshift.AddSCCToServiceAccount(securityClient, "privileged", "registry", "default", os.Stdout)
65+
err = retry.RetryOnConflict(retry.DefaultRetry, func() error {
66+
securityClient, err := securityclient.NewForConfig(restConfig)
67+
if err != nil {
68+
return err
69+
}
70+
privilegedSCC, err := securityClient.SecurityContextConstraints().Get("privileged", metav1.GetOptions{})
71+
if err != nil {
72+
return err
73+
}
74+
privilegedSCC.Users = append(privilegedSCC.Users, serviceaccount.MakeUsername("default", "registry"))
75+
_, err = securityClient.SecurityContextConstraints().Update(privilegedSCC)
76+
if err != nil {
77+
return err
78+
}
79+
return nil
80+
})
6381
if err != nil {
64-
return errors.NewError("cannot add privileged SCC to registry service account").WithCause(err)
82+
return errors.NewError("cannot update privileged SCC").WithCause(err)
6583
}
6684

6785
// Obtain registry markup. The reason it is not created outright is because
Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
package router
2+
3+
import (
4+
"bytes"
5+
"fmt"
6+
"io"
7+
"io/ioutil"
8+
"os"
9+
"path"
10+
"path/filepath"
11+
12+
"github.com/golang/glog"
13+
"k8s.io/client-go/util/retry"
14+
15+
apierrors "k8s.io/apimachinery/pkg/api/errors"
16+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
17+
"k8s.io/apiserver/pkg/authentication/serviceaccount"
18+
kclientcmd "k8s.io/client-go/tools/clientcmd"
19+
kapi "k8s.io/kubernetes/pkg/apis/core"
20+
kclientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
21+
22+
"github.com/openshift/origin/pkg/cmd/server/admin"
23+
"github.com/openshift/origin/pkg/oc/bootstrap/clusterup/componentinstall"
24+
"github.com/openshift/origin/pkg/oc/bootstrap/docker/dockerhelper"
25+
"github.com/openshift/origin/pkg/oc/bootstrap/docker/run"
26+
"github.com/openshift/origin/pkg/oc/errors"
27+
securityclientinternal "github.com/openshift/origin/pkg/security/generated/internalclientset"
28+
)
29+
30+
const (
31+
DefaultNamespace = "default"
32+
RouterServiceAccountName = "router"
33+
RouterServiceName = "router"
34+
)
35+
36+
type RouterComponentOptions struct {
37+
OCImage string
38+
MasterConfigDir string
39+
ImageFormat string
40+
PublicMasterURL string
41+
RoutingSuffix string
42+
PortForwarding bool
43+
}
44+
45+
func (c *RouterComponentOptions) Name() string {
46+
return "openshift-router"
47+
}
48+
49+
func (c *RouterComponentOptions) Install(dockerClient dockerhelper.Interface, logdir string) error {
50+
clusterAdminKubeConfigBytes, err := ioutil.ReadFile(path.Join(c.MasterConfigDir, "admin.kubeconfig"))
51+
if err != nil {
52+
return err
53+
}
54+
restConfig, err := kclientcmd.RESTConfigFromKubeConfig(clusterAdminKubeConfigBytes)
55+
if err != nil {
56+
return err
57+
}
58+
kubeClient, err := kclientset.NewForConfig(restConfig)
59+
if err != nil {
60+
return err
61+
}
62+
_, err = kubeClient.Core().Services(DefaultNamespace).Get(RouterServiceName, metav1.GetOptions{})
63+
if err == nil {
64+
glog.V(3).Infof("The %q service is already present, skipping installation", RouterServiceName)
65+
// Router service already exists, nothing to do
66+
return nil
67+
}
68+
if !apierrors.IsNotFound(err) {
69+
return errors.NewError("error retrieving router service").WithCause(err)
70+
}
71+
72+
componentName := "install-router"
73+
imageRunHelper := run.NewRunHelper(dockerhelper.NewHelper(dockerClient)).New()
74+
glog.Infof("Running %q", componentName)
75+
76+
// Create service account for router
77+
routerSA := &kapi.ServiceAccount{}
78+
routerSA.Name = RouterServiceAccountName
79+
_, err = kubeClient.Core().ServiceAccounts("default").Create(routerSA)
80+
if err != nil {
81+
return errors.NewError("cannot create router service account").WithCause(err)
82+
}
83+
84+
// Add router SA to privileged SCC
85+
err = retry.RetryOnConflict(retry.DefaultRetry, func() error {
86+
securityClient, err := securityclientinternal.NewForConfig(restConfig)
87+
if err != nil {
88+
return err
89+
}
90+
privilegedSCC, err := securityClient.Security().SecurityContextConstraints().Get("privileged", metav1.GetOptions{})
91+
if err != nil {
92+
return err
93+
}
94+
privilegedSCC.Users = append(privilegedSCC.Users, serviceaccount.MakeUsername("default", RouterServiceAccountName))
95+
_, err = securityClient.Security().SecurityContextConstraints().Update(privilegedSCC)
96+
if err != nil {
97+
return err
98+
}
99+
return nil
100+
})
101+
if err != nil {
102+
return errors.NewError("cannot update privileged SCC").WithCause(err)
103+
}
104+
105+
// Create router cert
106+
cmdOutput := &bytes.Buffer{}
107+
createCertOptions := &admin.CreateServerCertOptions{
108+
SignerCertOptions: &admin.SignerCertOptions{
109+
CertFile: filepath.Join(c.MasterConfigDir, "ca.crt"),
110+
KeyFile: filepath.Join(c.MasterConfigDir, "ca.key"),
111+
SerialFile: filepath.Join(c.MasterConfigDir, "ca.serial.txt"),
112+
},
113+
Overwrite: true,
114+
Hostnames: []string{
115+
c.RoutingSuffix,
116+
// This will ensure that routes using edge termination and the default
117+
// certs will use certs valid for their arbitrary subdomain names.
118+
fmt.Sprintf("*.%s", c.RoutingSuffix),
119+
},
120+
CertFile: filepath.Join(c.MasterConfigDir, "router.crt"),
121+
KeyFile: filepath.Join(c.MasterConfigDir, "router.key"),
122+
Output: cmdOutput,
123+
}
124+
_, err = createCertOptions.CreateServerCert()
125+
if err != nil {
126+
return errors.NewError("cannot create router cert").WithCause(err)
127+
}
128+
129+
err = catFiles(filepath.Join(c.MasterConfigDir, "router.pem"),
130+
filepath.Join(c.MasterConfigDir, "router.crt"),
131+
filepath.Join(c.MasterConfigDir, "router.key"),
132+
filepath.Join(c.MasterConfigDir, "ca.crt"))
133+
if err != nil {
134+
return errors.NewError("cannot create aggregate router cert").WithCause(err)
135+
}
136+
137+
routerCertPath := c.MasterConfigDir + "/router.pem"
138+
flags := []string{
139+
"adm", "router",
140+
"--host-ports=true",
141+
"--loglevel=8",
142+
"--config=" + c.MasterConfigDir + "/admin.kubeconfig",
143+
fmt.Sprintf("--host-network=%v", !c.PortForwarding),
144+
fmt.Sprintf("--images=%s", c.ImageFormat),
145+
fmt.Sprintf("--default-cert=%s", routerCertPath),
146+
}
147+
_, stdout, stderr, rc, err := imageRunHelper.Image(c.OCImage).
148+
Privileged().
149+
DiscardContainer().
150+
HostNetwork().
151+
Bind(c.MasterConfigDir + ":" + c.MasterConfigDir).
152+
Entrypoint("oc").
153+
Command(flags...).Output()
154+
155+
if err := componentinstall.LogContainer(logdir, componentName, stdout, stderr); err != nil {
156+
glog.Errorf("error logging %q: %v", componentName, err)
157+
}
158+
if err != nil {
159+
return errors.NewError("could not run %q: %v", componentName, err).WithCause(err)
160+
}
161+
if rc != 0 {
162+
return errors.NewError("could not run %q: rc==%v", componentName, rc)
163+
}
164+
return nil
165+
}
166+
167+
// catFiles concatenates multiple source files into a single destination file
168+
func catFiles(dest string, src ...string) error {
169+
out, err := os.Create(dest)
170+
if err != nil {
171+
return err
172+
}
173+
defer out.Close()
174+
for _, f := range src {
175+
in, oerr := os.Open(f)
176+
if oerr != nil {
177+
return err
178+
}
179+
_, err = io.Copy(out, in)
180+
in.Close()
181+
if err != nil {
182+
return err
183+
}
184+
}
185+
return nil
186+
}

0 commit comments

Comments
 (0)