Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 10 additions & 64 deletions internal/service/component.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ package service

import (
"context"
"fmt"
"io"
"time"

"github.com/briandowns/spinner"
Expand Down Expand Up @@ -36,69 +34,17 @@ func (e *Component) OperateComponent(ctx *context.Context, request *serviceProto
return err
}

var message string
var retries = 0

responseChan := make(chan *serviceProto.OperateServiceResponse)
errorChan := make(chan error)
go func(ctx context.Context) {
for {
select {
case <-ctx.Done():
return
default:
response, err := stream.Recv()
if err != nil {
errorChan <- err
}
responseChan <- response
}
}
}(*requestCtx)

for {
recvCtx, cancel := context.WithTimeout(*requestCtx, constant.Timeout)

select {
case <-recvCtx.Done():
spinnerInstance.Stop()
cancel()
if !util.CanPerformRetry(retries, constant.MaxRetries) {
return nil
}
stream, err = reconnectOperateStream(client, requestCtx, request, stream)
if err != nil {
return nil
}
retries++
case err := <-errorChan:
spinnerInstance.Stop()
cancel()
if !util.IsRetryable(err) || !util.CanPerformRetry(retries, constant.MaxRetries) {
if err != io.EOF {
return err
} else if err == io.EOF {
log.Info(message)
}
return nil
}
stream, err = reconnectOperateStream(client, requestCtx, request, stream)
if err != nil {
return nil
}
retries++
case response := <-responseChan:
spinnerInstance.Stop()
cancel()
if response != nil {
message = util.GenerateResponseMessageComponentSpecific(response.GetServiceResponse(), []string{request.GetComponentName()})
logFailedComponentMessagesOnceForComponents(response.GetServiceResponse(), []string{request.GetComponentName()})
spinnerInstance.Prefix = fmt.Sprintf(" %s ", message)
spinnerInstance.Start()
retries = 0
}
}
reconnect := func() (serviceProto.ServiceService_OperateServiceClient, error) {
return reconnectOperateStream(client, requestCtx, request, stream)
}

generateResponse := func(response *serviceProto.OperateServiceResponse) string {
message := util.GenerateResponseMessageComponentSpecific(response.GetServiceResponse(), []string{request.GetComponentName()})
logFailedComponentMessagesOnceForComponents(response.GetServiceResponse(), []string{request.GetComponentName()})
return message
}

return handleStreamResponse(stream, requestCtx, spinnerInstance, reconnect, generateResponse)
}

func reconnectOperateStream(client serviceProto.ServiceServiceClient, requestCtx *context.Context, request *serviceProto.OperateServiceRequest, stream serviceProto.ServiceService_OperateServiceClient) (serviceProto.ServiceService_OperateServiceClient, error) {
Expand Down
215 changes: 30 additions & 185 deletions internal/service/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,69 +40,17 @@ func (e *Service) DeployService(ctx *context.Context, request *serviceProto.Depl
return err
}

var message string
var retries = 0

responseChan := make(chan *serviceProto.DeployServiceResponse)
errorChan := make(chan error)
go func(ctx context.Context) {
for {
select {
case <-ctx.Done():
return
default:
response, err := stream.Recv()
if err != nil {
errorChan <- err
}
responseChan <- response
}
}
}(*requestCtx)

for {
recvCtx, cancel := context.WithTimeout(*requestCtx, constant.Timeout)
reconnect := func() (serviceProto.ServiceService_DeployServiceClient, error) {
return reconnectDeployServiceStream(client, requestCtx, request, stream)
}

select {
case <-recvCtx.Done():
spinnerInstance.Stop()
cancel()
if !util.CanPerformRetry(retries, constant.MaxRetries) {
return nil
}
stream, err = reconnectDeployServiceStream(client, requestCtx, request, stream)
if err != nil {
return nil
}
retries++
case err := <-errorChan:
spinnerInstance.Stop()
cancel()
if !util.IsRetryable(err) || !util.CanPerformRetry(retries, constant.MaxRetries) {
if err != io.EOF {
return err
} else if err == io.EOF {
log.Info(message)
}
return nil
}
stream, err = reconnectDeployServiceStream(client, requestCtx, request, stream)
if err != nil {
return nil
}
retries++
case response := <-responseChan:
spinnerInstance.Stop()
cancel()
if response != nil {
message = util.GenerateResponseMessage(response.GetServiceResponse())
logFailedComponentMessagesOnce(response.GetServiceResponse())
spinnerInstance.Prefix = fmt.Sprintf(" %s ", message)
spinnerInstance.Start()
retries = 0 // Reset retries on successful response
}
}
generateResponse := func(response *serviceProto.DeployServiceResponse) string {
message := util.GenerateResponseMessage(response.GetServiceResponse())
logFailedComponentMessagesOnce(response.GetServiceResponse())
return message
}

return handleStreamResponse(stream, requestCtx, spinnerInstance, reconnect, generateResponse)
}

func logFailedComponentMessagesOnce(response *serviceProto.ServiceResponse) {
Expand Down Expand Up @@ -214,74 +162,22 @@ func (e *Service) DeployReleasedService(ctx *context.Context, request *servicePr
if err != nil {
return err
}
reconnect := func() (serviceProto.ServiceService_DeployReleasedServiceClient, error) {
return reconnectDeployReleasedServiceStream(client, requestCtx, request, stream)
}

var message string
var retries = 0

responseChan := make(chan *serviceProto.DeployReleasedServiceResponse)
errorChan := make(chan error)
go func(ctx context.Context) {
for {
select {
case <-ctx.Done():
return
default:
response, err := stream.Recv()
if err != nil {
errorChan <- err
}
responseChan <- response
}
}
}(*requestCtx)
for {
recvCtx, cancel := context.WithTimeout(*requestCtx, constant.Timeout)

select {
case <-recvCtx.Done():
spinnerInstance.Stop()
cancel()
if !util.CanPerformRetry(retries, constant.MaxRetries) {
return nil
}
stream, err = reconnectDeployReleasedServiceStream(client, requestCtx, request, stream)
if err != nil {
return nil
}
retries++
case err := <-errorChan:
spinnerInstance.Stop()
cancel()
if !util.IsRetryable(err) || !util.CanPerformRetry(retries, constant.MaxRetries) {
if err != io.EOF {
return err
} else if err == io.EOF {
log.Info(message)
}
return nil
}
stream, err = reconnectDeployReleasedServiceStream(client, requestCtx, request, stream)
if err != nil {
return nil
}
retries++
case response := <-responseChan:
spinnerInstance.Stop()
cancel()
if response != nil {
message = response.ServiceResponse.Message
message += fmt.Sprintf("\n Service %s %s", response.ServiceResponse.ServiceStatus.ServiceAction, response.ServiceResponse.ServiceStatus)
for _, compMessage := range response.ServiceResponse.ComponentsStatus {
message += fmt.Sprintf("\n Component %s %s %s", compMessage.ComponentName, compMessage.ComponentAction, compMessage.ComponentStatus)
}
logFailedComponentMessagesOnce(response.GetServiceResponse())
spinnerInstance.Prefix = fmt.Sprintf(" %s ", message)
spinnerInstance.Start()
retries = 0 // Reset retries on successful response
}
generateResponse := func(response *serviceProto.DeployReleasedServiceResponse) string {
message := response.ServiceResponse.Message
message += fmt.Sprintf("\n Service %s %s", response.ServiceResponse.ServiceStatus.ServiceAction, response.ServiceResponse.ServiceStatus)
for _, compMessage := range response.ServiceResponse.ComponentsStatus {
message += fmt.Sprintf("\n Component %s %s %s", compMessage.ComponentName, compMessage.ComponentAction, compMessage.ComponentStatus)
}
logFailedComponentMessagesOnce(response.GetServiceResponse())
return message
}

return handleStreamResponse(stream, requestCtx, spinnerInstance, reconnect, generateResponse)

}

// UndeployService undeploy service
Expand Down Expand Up @@ -349,68 +245,17 @@ func (e *Service) OperateService(ctx *context.Context, request *serviceProto.Ope
return err
}

var message string
var retries = 0

responseChan := make(chan *serviceProto.OperateServiceResponse)
errorChan := make(chan error)
go func(ctx context.Context) {
for {
select {
case <-ctx.Done():
return
default:
response, err := stream.Recv()
if err != nil {
errorChan <- err
}
responseChan <- response
}
}
}(*requestCtx)
for {
recvCtx, cancel := context.WithTimeout(*requestCtx, constant.Timeout)
reconnect := func() (serviceProto.ServiceService_OperateServiceClient, error) {
return reconnectOperateStream(client, requestCtx, request, stream)
}

select {
case <-recvCtx.Done():
spinnerInstance.Stop()
cancel()
if !util.CanPerformRetry(retries, constant.MaxRetries) {
return nil
}
stream, err = reconnectOperateStream(client, requestCtx, request, stream)
if err != nil {
return nil
}
retries++
case err := <-errorChan:
spinnerInstance.Stop()
cancel()
if !util.IsRetryable(err) || !util.CanPerformRetry(retries, constant.MaxRetries) {
if err != io.EOF {
return err
} else if err == io.EOF {
log.Info(message)
}
return nil
}
stream, err = reconnectOperateStream(client, requestCtx, request, stream)
if err != nil {
return nil
}
retries++
case response := <-responseChan:
spinnerInstance.Stop()
cancel()
if response != nil {
message = util.GenerateResponseMessageComponentSpecific(response.GetServiceResponse(), []string{request.GetComponentName()})
logFailedComponentMessagesOnceForComponents(response.GetServiceResponse(), []string{request.GetComponentName()})
spinnerInstance.Prefix = fmt.Sprintf(" %s ", message)
spinnerInstance.Start()
retries = 0
}
}
generateResponse := func(response *serviceProto.OperateServiceResponse) string {
message := util.GenerateResponseMessageComponentSpecific(response.GetServiceResponse(), []string{request.GetComponentName()})
logFailedComponentMessagesOnceForComponents(response.GetServiceResponse(), []string{request.GetComponentName()})
return message
}

return handleStreamResponse(stream, requestCtx, spinnerInstance, reconnect, generateResponse)
}

// ListService deploys service
Expand Down
Loading