Determine whether it is necessary to create a service (#333)

* Determine whether it is necessary to create a service

* add checkContainerPortsSpecified func

* add check workload is nil
This commit is contained in:
silenceper
2020-09-28 10:08:51 +08:00
committed by GitHub
parent c4dd02761a
commit 24c30e65fb
@@ -109,26 +109,7 @@ func (r *Reconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
fmt.Sprintf("Workload `%s` successfully patched a deployment `%s`",
workload.Name, deploy.Name)))
// create a service for the workload
service, err := r.renderService(ctx, &workload)
if err != nil {
log.Error(err, "Failed to render a service")
r.record.Event(eventObj, event.Warning(errRenderService, err))
return util.ReconcileWaitResult,
util.PatchCondition(ctx, r, &workload, cpv1alpha1.ReconcileError(errors.Wrap(err, errRenderService)))
}
// server side apply the service
if err := r.Patch(ctx, service, client.Apply, applyOpts...); err != nil {
log.Error(err, "Failed to apply a service")
r.record.Event(eventObj, event.Warning(errApplyDeployment, err))
return util.ReconcileWaitResult,
util.PatchCondition(ctx, r, &workload, cpv1alpha1.ReconcileError(errors.Wrap(err, errApplyService)))
}
r.record.Event(eventObj, event.Normal("Service created",
fmt.Sprintf("Workload `%s` successfully server side patched a service `%s`",
workload.Name, service.Name)))
// record the new deployment, new service
// record the new deployment
workload.Status.Resources = []cpv1alpha1.TypedReference{
{
APIVersion: deploy.GetObjectKind().GroupVersionKind().GroupVersion().String(),
@@ -136,12 +117,37 @@ func (r *Reconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
Name: deploy.GetName(),
UID: deploy.UID,
},
{
}
// Determine whether it is necessary to create a service.if container.
setPorts := r.checkContainerPortsSpecified(ctx, &workload)
if !setPorts {
// create a service for the workload
service, err := r.renderService(ctx, &workload)
if err != nil {
log.Error(err, "Failed to render a service")
r.record.Event(eventObj, event.Warning(errRenderService, err))
return util.ReconcileWaitResult,
util.PatchCondition(ctx, r, &workload, cpv1alpha1.ReconcileError(errors.Wrap(err, errRenderService)))
}
// server side apply the service
if err := r.Patch(ctx, service, client.Apply, applyOpts...); err != nil {
log.Error(err, "Failed to apply a service")
r.record.Event(eventObj, event.Warning(errApplyDeployment, err))
return util.ReconcileWaitResult,
util.PatchCondition(ctx, r, &workload, cpv1alpha1.ReconcileError(errors.Wrap(err, errApplyService)))
}
r.record.Event(eventObj, event.Normal("Service created",
fmt.Sprintf("Workload `%s` successfully server side patched a service `%s`",
workload.Name, service.Name)))
// record the new service
workload.Status.Resources = append(workload.Status.Resources, cpv1alpha1.TypedReference{
APIVersion: service.GetObjectKind().GroupVersionKind().GroupVersion().String(),
Kind: service.GetObjectKind().GroupVersionKind().Kind,
Name: service.GetName(),
UID: service.UID,
},
})
}
if err := r.Status().Update(ctx, &workload); err != nil {
@@ -204,6 +210,20 @@ func (r *Reconciler) renderDeployment(ctx context.Context,
return deploy, nil
}
// check whether the container port is specified
func (r *Reconciler) checkContainerPortsSpecified(ctx context.Context,
workload *v1alpha1.Containerized) bool {
if workload == nil {
return false
}
for _, container := range workload.Spec.PodSpec.Containers {
if len(container.Ports) > 0 {
return true
}
}
return false
}
// create a service for the deployment
func (r *Reconciler) renderService(ctx context.Context,
workload *v1alpha1.Containerized) (*corev1.Service, error) {