Skip to content

Commit daaafeb

Browse files
Merge pull request #19473 from deads2k/deploy-01-kubelet
remove directly kubelet dependency from deploymentconfigs
2 parents 818924b + 3a49631 commit daaafeb

File tree

4 files changed

+130
-176
lines changed

4 files changed

+130
-176
lines changed

pkg/apps/apiserver/apiserver.go

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package apiserver
22

33
import (
4-
"fmt"
54
"sync"
65

76
"k8s.io/apimachinery/pkg/apimachinery/registered"
@@ -10,11 +9,9 @@ import (
109
"k8s.io/apimachinery/pkg/runtime/serializer"
1110
"k8s.io/apiserver/pkg/registry/rest"
1211
genericapiserver "k8s.io/apiserver/pkg/server"
13-
kclientsetexternal "k8s.io/client-go/kubernetes"
1412
restclient "k8s.io/client-go/rest"
1513
"k8s.io/kubernetes/pkg/api/legacyscheme"
1614
kclientsetinternal "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
17-
kubeletclient "k8s.io/kubernetes/pkg/kubelet/client"
1815

1916
appsapiv1 "github.com/openshift/api/apps/v1"
2017
appsclientinternal "github.com/openshift/origin/pkg/apps/generated/internalclientset"
@@ -27,7 +24,6 @@ import (
2724

2825
type ExtraConfig struct {
2926
KubeAPIServerClientConfig *restclient.Config
30-
KubeletClientConfig *kubeletclient.KubeletClientConfig
3127

3228
// TODO these should all become local eventually
3329
Scheme *runtime.Scheme
@@ -121,14 +117,6 @@ func (c *completedConfig) newV1RESTStorage() (map[string]rest.Storage, error) {
121117
if err != nil {
122118
return nil, err
123119
}
124-
kubeExternalClient, err := kclientsetexternal.NewForConfig(c.ExtraConfig.KubeAPIServerClientConfig)
125-
if err != nil {
126-
return nil, err
127-
}
128-
nodeConnectionInfoGetter, err := kubeletclient.NewNodeConnectionInfoGetter(kubeExternalClient.CoreV1().Nodes(), *c.ExtraConfig.KubeletClientConfig)
129-
if err != nil {
130-
return nil, fmt.Errorf("unable to configure the node connection info getter: %v", err)
131-
}
132120

133121
deployConfigStorage, deployConfigStatusStorage, deployConfigScaleStorage, err := deployconfigetcd.NewREST(c.GenericConfig.RESTOptionsGetter)
134122
if err != nil {
@@ -148,7 +136,7 @@ func (c *completedConfig) newV1RESTStorage() (map[string]rest.Storage, error) {
148136
v1Storage["deploymentConfigs/scale"] = deployConfigScaleStorage
149137
v1Storage["deploymentConfigs/status"] = deployConfigStatusStorage
150138
v1Storage["deploymentConfigs/rollback"] = deployConfigRollbackStorage
151-
v1Storage["deploymentConfigs/log"] = deploylogregistry.NewREST(openshiftInternalAppsClient.Apps(), kubeInternalClient.Core(), kubeInternalClient.Core(), nodeConnectionInfoGetter)
139+
v1Storage["deploymentConfigs/log"] = deploylogregistry.NewREST(openshiftInternalAppsClient.Apps(), kubeInternalClient.Core(), kubeInternalClient.Core())
152140
v1Storage["deploymentConfigs/instantiate"] = dcInstantiateStorage
153141
return v1Storage, nil
154142
}

pkg/apps/registry/deploylog/rest.go

Lines changed: 59 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package deploylog
22

33
import (
44
"fmt"
5+
"io"
56
"sort"
67
"time"
78

@@ -11,6 +12,7 @@ import (
1112
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1213
"k8s.io/apimachinery/pkg/labels"
1314
"k8s.io/apimachinery/pkg/runtime"
15+
"k8s.io/apimachinery/pkg/runtime/schema"
1416
"k8s.io/apimachinery/pkg/util/wait"
1517
apirequest "k8s.io/apiserver/pkg/endpoints/request"
1618
genericrest "k8s.io/apiserver/pkg/registry/generic/rest"
@@ -19,8 +21,6 @@ import (
1921
kcoreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion"
2022
"k8s.io/kubernetes/pkg/controller"
2123
kcmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
22-
kubeletclient "k8s.io/kubernetes/pkg/kubelet/client"
23-
"k8s.io/kubernetes/pkg/registry/core/pod"
2424

2525
appsapi "github.com/openshift/origin/pkg/apps/apis/apps"
2626
"github.com/openshift/origin/pkg/apps/apis/apps/validation"
@@ -36,29 +36,16 @@ const (
3636
defaultInterval = 1 * time.Second
3737
)
3838

39-
// podGetter implements the ResourceGetter interface. Used by LogLocation to
40-
// retrieve the deployer pod
41-
type podGetter struct {
42-
pn kcoreclient.PodsGetter
43-
}
44-
45-
// Get is responsible for retrieving the deployer pod
46-
func (g *podGetter) Get(ctx apirequest.Context, name string, options *metav1.GetOptions) (runtime.Object, error) {
47-
namespace, ok := apirequest.NamespaceFrom(ctx)
48-
if !ok {
49-
return nil, errors.NewBadRequest("namespace parameter required.")
50-
}
51-
return g.pn.Pods(namespace).Get(name, *options)
52-
}
53-
5439
// REST is an implementation of RESTStorage for the api server.
5540
type REST struct {
56-
dn appsclient.DeploymentConfigsGetter
57-
rn kcoreclient.ReplicationControllersGetter
58-
pn kcoreclient.PodsGetter
59-
connInfo kubeletclient.ConnectionInfoGetter
60-
timeout time.Duration
61-
interval time.Duration
41+
dcClient appsclient.DeploymentConfigsGetter
42+
rcClient kcoreclient.ReplicationControllersGetter
43+
podClient kcoreclient.PodsGetter
44+
timeout time.Duration
45+
interval time.Duration
46+
47+
// for unit testing
48+
getLogsFn func(podNamespace, podName string, logOpts *kapi.PodLogOptions) (runtime.Object, error)
6249
}
6350

6451
// REST implements GetterWithOptions
@@ -68,15 +55,17 @@ var _ = rest.GetterWithOptions(&REST{})
6855
// one for deployments (replication controllers) and one for pods to get the necessary
6956
// attributes to assemble the URL to which the request shall be redirected in order to
7057
// get the deployment logs.
71-
func NewREST(dn appsclient.DeploymentConfigsGetter, rn kcoreclient.ReplicationControllersGetter, pn kcoreclient.PodsGetter, connectionInfo kubeletclient.ConnectionInfoGetter) *REST {
72-
return &REST{
73-
dn: dn,
74-
rn: rn,
75-
pn: pn,
76-
connInfo: connectionInfo,
77-
timeout: defaultTimeout,
78-
interval: defaultInterval,
58+
func NewREST(dcClient appsclient.DeploymentConfigsGetter, rcClient kcoreclient.ReplicationControllersGetter, podClient kcoreclient.PodsGetter) *REST {
59+
r := &REST{
60+
dcClient: dcClient,
61+
rcClient: rcClient,
62+
podClient: podClient,
63+
timeout: defaultTimeout,
64+
interval: defaultInterval,
7965
}
66+
r.getLogsFn = r.getLogs
67+
68+
return r
8069
}
8170

8271
// NewGetOptions returns a new options object for deployment logs
@@ -108,7 +97,7 @@ func (r *REST) Get(ctx apirequest.Context, name string, opts runtime.Object) (ru
10897

10998
// Fetch deploymentConfig and check latest version; if 0, there are no deployments
11099
// for this config
111-
config, err := r.dn.DeploymentConfigs(namespace).Get(name, metav1.GetOptions{})
100+
config, err := r.dcClient.DeploymentConfigs(namespace).Get(name, metav1.GetOptions{})
112101
if err != nil {
113102
return nil, errors.NewNotFound(appsapi.Resource("deploymentconfig"), name)
114103
}
@@ -154,11 +143,11 @@ func (r *REST) Get(ctx apirequest.Context, name string, opts runtime.Object) (ru
154143
}
155144
glog.V(4).Infof("Deployment %s is in %s state, waiting for it to start...", appsutil.LabelForDeployment(target), status)
156145

157-
if err := appsutil.WaitForRunningDeployerPod(r.pn, target, r.timeout); err != nil {
146+
if err := appsutil.WaitForRunningDeployerPod(r.podClient, target, r.timeout); err != nil {
158147
return nil, errors.NewBadRequest(fmt.Sprintf("failed to run deployer pod %s: %v", podName, err))
159148
}
160149

161-
latest, ok, err := registry.WaitForRunningDeployment(r.rn, target, r.timeout)
150+
latest, ok, err := registry.WaitForRunningDeployment(r.rcClient, target, r.timeout)
162151
if err != nil {
163152
return nil, errors.NewBadRequest(fmt.Sprintf("unable to wait for deployment %s to run: %v", appsutil.LabelForDeployment(target), err))
164153
}
@@ -179,20 +168,46 @@ func (r *REST) Get(ctx apirequest.Context, name string, opts runtime.Object) (ru
179168
}
180169

181170
logOpts := appsapi.DeploymentToPodLogOptions(deployLogOpts)
182-
location, transport, err := pod.LogLocation(&podGetter{r.pn}, r.connInfo, ctx, podName, logOpts)
171+
return r.getLogsFn(namespace, podName, logOpts)
172+
}
173+
174+
func (r *REST) getLogs(podNamespace, podName string, logOpts *kapi.PodLogOptions) (runtime.Object, error) {
175+
logRequest := r.podClient.Pods(podNamespace).GetLogs(podName, logOpts)
176+
177+
readerCloser, err := logRequest.Stream()
183178
if err != nil {
184-
return nil, errors.NewBadRequest(err.Error())
179+
return nil, err
185180
}
186181

187-
return &genericrest.LocationStreamer{
188-
Location: location,
189-
Transport: transport,
190-
ContentType: "text/plain",
191-
Flush: deployLogOpts.Follow,
192-
ResponseChecker: genericrest.NewGenericHttpResponseChecker(kapi.Resource("pod"), podName),
182+
return &passThroughStreamer{
183+
In: readerCloser,
184+
Flush: logOpts.Follow,
185+
ContentType: "text/plain",
193186
}, nil
194187
}
195188

189+
type passThroughStreamer struct {
190+
In io.ReadCloser
191+
Flush bool
192+
ContentType string
193+
}
194+
195+
// a PipeStreamer must implement a rest.ResourceStreamer
196+
var _ rest.ResourceStreamer = &passThroughStreamer{}
197+
198+
func (obj *passThroughStreamer) GetObjectKind() schema.ObjectKind {
199+
return schema.EmptyObjectKind
200+
}
201+
202+
func (obj *passThroughStreamer) DeepCopyObject() runtime.Object {
203+
panic("passThroughStreamer does not implement DeepCopyObject")
204+
}
205+
206+
// InputStream returns a stream with the contents of the embedded pipe.
207+
func (s *passThroughStreamer) InputStream(apiVersion, acceptHeader string) (stream io.ReadCloser, flush bool, contentType string, err error) {
208+
return s.In, s.Flush, s.ContentType, nil
209+
}
210+
196211
// waitForExistingDeployment will use the timeout to wait for a deployment to appear.
197212
func (r *REST) waitForExistingDeployment(namespace, name string) (*kapi.ReplicationController, error) {
198213
var (
@@ -201,7 +216,7 @@ func (r *REST) waitForExistingDeployment(namespace, name string) (*kapi.Replicat
201216
)
202217

203218
condition := func() (bool, error) {
204-
target, err = r.rn.ReplicationControllers(namespace).Get(name, metav1.GetOptions{})
219+
target, err = r.rcClient.ReplicationControllers(namespace).Get(name, metav1.GetOptions{})
205220
switch {
206221
case errors.IsNotFound(err):
207222
return false, nil
@@ -224,7 +239,7 @@ func (r *REST) returnApplicationPodName(target *kapi.ReplicationController) (str
224239
selector := labels.SelectorFromValidatedSet(labels.Set(target.Spec.Selector))
225240
sortBy := func(pods []*kapiv1.Pod) sort.Interface { return controller.ByLogging(pods) }
226241

227-
firstPod, _, err := kcmdutil.GetFirstPod(r.pn, target.Namespace, selector.String(), r.timeout, sortBy)
242+
firstPod, _, err := kcmdutil.GetFirstPod(r.podClient, target.Namespace, selector.String(), r.timeout, sortBy)
228243
if err != nil {
229244
return "", errors.NewInternalError(err)
230245
}

0 commit comments

Comments
 (0)