Skip to content
Merged
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
4 changes: 2 additions & 2 deletions api/cluster/ClusterRestHandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -556,7 +556,7 @@ func (impl ClusterRestHandlerImpl) DeleteCluster(w http.ResponseWriter, r *http.
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized)
return
}
var bean bean2.ClusterBean
var bean bean2.DeleteClusterBean
err = decoder.Decode(&bean)
if err != nil {
impl.logger.Errorw("request err, Delete", "error", err, "payload", bean)
Expand All @@ -580,7 +580,7 @@ func (impl ClusterRestHandlerImpl) DeleteCluster(w http.ResponseWriter, r *http.
//RBAC enforcer Ends
err = impl.deleteService.DeleteCluster(&bean, userId)
if err != nil {
impl.logger.Errorw("error in deleting cluster", "err", err, "id", bean.Id, "name", bean.ClusterName)
impl.logger.Errorw("error in deleting cluster", "err", err, "id", bean.Id)
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
return
}
Expand Down
Binary file added assets/plugin-icons/ic-plugin-aws-ecr-retag.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions pkg/cluster/ClusterService.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ type ClusterService interface {
FindAllExceptVirtual() ([]*bean.ClusterBean, error)
FindAllWithoutConfig() ([]*bean.ClusterBean, error)
FindAllActive() ([]bean.ClusterBean, error)
DeleteFromDb(bean *bean.ClusterBean, userId int32) (string, error)
DeleteFromDb(bean *clusterBean.DeleteClusterBean, userId int32) (string, error)

FindById(id int) (*bean.ClusterBean, error)
FindByIdWithoutConfig(id int) (*bean.ClusterBean, error)
Expand Down Expand Up @@ -580,7 +580,7 @@ func (impl *ClusterServiceImpl) buildInformer() {
impl.K8sInformerFactory.BuildInformer(clusterInfo)
}

func (impl *ClusterServiceImpl) DeleteFromDb(bean *bean.ClusterBean, userId int32) (string, error) {
func (impl *ClusterServiceImpl) DeleteFromDb(bean *clusterBean.DeleteClusterBean, userId int32) (string, error) {
existingCluster, err := impl.clusterRepository.FindById(bean.Id)
if err != nil {
impl.logger.Errorw("No matching entry found for delete.", "id", bean.Id)
Expand Down
2 changes: 1 addition & 1 deletion pkg/cluster/ClusterServiceExtended.go
Original file line number Diff line number Diff line change
Expand Up @@ -361,7 +361,7 @@ func (impl *ClusterServiceImplExtended) Save(ctx context.Context, bean *bean.Clu
return clusterBean, nil
}

func (impl ClusterServiceImplExtended) DeleteFromDb(bean *bean.ClusterBean, userId int32) (string, error) {
func (impl ClusterServiceImplExtended) DeleteFromDb(bean *bean.DeleteClusterBean, userId int32) (string, error) {
existingCluster, err := impl.clusterRepository.FindById(bean.Id)
if err != nil {
impl.logger.Errorw("No matching entry found for delete.", "id", bean.Id)
Expand Down
4 changes: 4 additions & 0 deletions pkg/cluster/bean/bean.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,10 @@ func (bean ClusterBean) GetClusterConfig() *k8s.ClusterConfig {
return clusterCfg
}

type DeleteClusterBean struct {
Id int `json:"id" validate:"number,required"`
}

type UserInfo struct {
UserName string `json:"userName,omitempty"`
Config map[string]string `json:"config,omitempty"`
Expand Down
10 changes: 5 additions & 5 deletions pkg/delete/DeleteService.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,13 +41,13 @@ import (
)

type DeleteService interface {
DeleteCluster(deleteRequest *bean2.ClusterBean, userId int32) error
DeleteCluster(deleteRequest *bean2.DeleteClusterBean, userId int32) error
DeleteEnvironment(deleteRequest *bean.EnvironmentBean, userId int32) error
DeleteTeam(deleteRequest *bean3.TeamRequest) error
DeleteChartRepo(deleteRequest *chartRepo.ChartRepoDto) error
DeleteDockerRegistryConfig(deleteRequest *types.DockerArtifactStoreBean) error
CanDeleteChartRegistryPullConfig(storeId string) bool
DeleteClusterConfigMap(deleteRequest *bean2.ClusterBean) error
DeleteClusterConfigMap(deleteRequest *bean2.DeleteClusterBean) error
}

type DeleteServiceImpl struct {
Expand Down Expand Up @@ -91,7 +91,7 @@ func NewDeleteServiceImpl(logger *zap.SugaredLogger,
}
}

func (impl DeleteServiceImpl) DeleteCluster(deleteRequest *bean2.ClusterBean, userId int32) error {
func (impl DeleteServiceImpl) DeleteCluster(deleteRequest *bean2.DeleteClusterBean, userId int32) error {
clusterName, err := impl.clusterService.DeleteFromDb(deleteRequest, userId)
if err != nil {
impl.logger.Errorw("error im deleting cluster", "err", err, "deleteRequest", deleteRequest)
Expand All @@ -108,11 +108,11 @@ func (impl DeleteServiceImpl) DeleteCluster(deleteRequest *bean2.ClusterBean, us
return nil
}

func (impl DeleteServiceImpl) DeleteClusterConfigMap(deleteRequest *bean2.ClusterBean) error {
func (impl DeleteServiceImpl) DeleteClusterConfigMap(deleteRequest *bean2.DeleteClusterBean) error {
// kubelink informers are listening this secret, deleting this secret will inform kubelink that this cluster is deleted
k8sClient, err := impl.K8sUtil.GetCoreV1ClientInCluster()
if err != nil {
impl.logger.Errorw("error in getting in cluster k8s client", "err", err, "clusterName", deleteRequest.ClusterName)
impl.logger.Errorw("error in getting in cluster k8s client", "err", err, "clusterId", deleteRequest.Id)
return nil
}
cmName := cluster.ParseCmNameForK8sInformerOnClusterEvent(deleteRequest.Id)
Expand Down
6 changes: 3 additions & 3 deletions pkg/delete/DeleteServiceExtended.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,15 +80,15 @@ func NewDeleteServiceExtendedImpl(logger *zap.SugaredLogger,
}
}

func (impl DeleteServiceExtendedImpl) DeleteCluster(deleteRequest *bean2.ClusterBean, userId int32) error {
func (impl DeleteServiceExtendedImpl) DeleteCluster(deleteRequest *bean2.DeleteClusterBean, userId int32) error {
//finding if there are env in this cluster or not, if yes then will not delete
env, err := impl.environmentRepository.FindByClusterId(deleteRequest.Id)
if err != nil && err != pg.ErrNoRows {
impl.logger.Errorw("err in deleting cluster", "clusterName", deleteRequest.ClusterName, "err", err)
impl.logger.Errorw("err in deleting cluster", "clusterId", deleteRequest.Id, "err", err)
return err
}
if len(env) > 0 {
impl.logger.Errorw("err in deleting cluster, found env in this cluster", "clusterName", deleteRequest.ClusterName, "err", err)
impl.logger.Errorw("err in deleting cluster, found env in this cluster", "clusterId", deleteRequest.Id, "err", err)
return &util.ApiError{HttpStatusCode: http.StatusBadRequest, UserMessage: " Please delete all related environments before deleting this cluster"}
}
clusterName, err := impl.clusterService.DeleteFromDb(deleteRequest, userId)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,19 @@ metadata:
{{- end}}
spec:
type: {{ .Values.service.type | default "ClusterIP" }}
{{- if (and (eq .Values.service.type "LoadBalancer") .Values.service.loadBalancerSourceRanges )}}
{{- with .Values.service.extraSpec }}
{{- toYaml . | nindent 2 }}
{{- end }}
{{- if (eq .Values.service.type "LoadBalancer") }}
{{- if .Values.service.loadBalancerIP }}
loadBalancerIP: {{ .Values.service.loadBalancerIP }}
{{- end }}
{{- if .Values.service.loadBalancerSourceRanges }}
loadBalancerSourceRanges:
{{- range .Values.service.loadBalancerSourceRanges }}
{{- range .Values.service.loadBalancerSourceRanges }}
- {{ . }}
{{- end }}
{{- end }}
{{- end }}
{{- end }}
ports:
{{- range .Values.ContainerPort }}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,19 @@ metadata:
{{- end}}
spec:
type: {{ .Values.service.type | default "ClusterIP" }}
{{- if (and (eq .Values.service.type "LoadBalancer") .Values.service.loadBalancerSourceRanges )}}
{{- with .Values.service.extraSpec }}
{{- toYaml . | nindent 2 }}
{{- end }}
{{- if (eq .Values.service.type "LoadBalancer") }}
{{- if .Values.service.loadBalancerIP }}
loadBalancerIP: {{ .Values.service.loadBalancerIP }}
{{- end }}
{{- if .Values.service.loadBalancerSourceRanges }}
loadBalancerSourceRanges:
{{- range .Values.service.loadBalancerSourceRanges }}
{{- range .Values.service.loadBalancerSourceRanges }}
- {{ . }}
{{- end }}
{{- end }}
{{- end }}
{{- end }}
ports:
{{- range .Values.ContainerPort }}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,10 @@ service:
type: ClusterIP
# name: "1234567890123456789012345678901234567890123456789012345678901234567890"
annotations: {}
# loadBalancerIP: "98.73.123.45"
# loadBalancerSourceRanges: ["127.0.0.1","127.0.0.1","127.0.0.1"]
extraSpec: {}
# externalTrafficPolicy: Local
# test1: test2
# test3: test4

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,19 @@ metadata:
{{- end}}
spec:
type: {{ .Values.service.type | default "ClusterIP" }}
{{- if (and (eq .Values.service.type "LoadBalancer") .Values.service.loadBalancerSourceRanges )}}
{{- with .Values.service.extraSpec }}
{{- toYaml . | nindent 2 }}
{{- end }}
{{- if (eq .Values.service.type "LoadBalancer") }}
{{- if .Values.service.loadBalancerIP }}
loadBalancerIP: {{ .Values.service.loadBalancerIP }}
{{- end }}
{{- if .Values.service.loadBalancerSourceRanges }}
loadBalancerSourceRanges:
{{- range .Values.service.loadBalancerSourceRanges }}
{{- range .Values.service.loadBalancerSourceRanges }}
- {{ . }}
{{- end }}
{{- end }}
{{- end }}
{{- end }}
ports:
{{- range .Values.ContainerPort }}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,19 @@ metadata:
{{- end}}
spec:
type: {{ .Values.service.type | default "ClusterIP" }}
{{- if (and (eq .Values.service.type "LoadBalancer") .Values.service.loadBalancerSourceRanges )}}
{{- with .Values.service.extraSpec }}
{{- toYaml . | nindent 2 }}
{{- end }}
{{- if (eq .Values.service.type "LoadBalancer") }}
{{- if .Values.service.loadBalancerIP }}
loadBalancerIP: {{ .Values.service.loadBalancerIP }}
{{- end }}
{{- if .Values.service.loadBalancerSourceRanges }}
loadBalancerSourceRanges:
{{- range .Values.service.loadBalancerSourceRanges }}
{{- range .Values.service.loadBalancerSourceRanges }}
- {{ . }}
{{- end }}
{{- end }}
{{- end }}
{{- end }}
ports:
{{- range .Values.ContainerPort }}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,19 @@ metadata:
{{- end }}
spec:
type: {{ .Values.service.type | default "ClusterIP" }}
{{- if (and (eq .Values.service.type "LoadBalancer") .Values.service.loadBalancerSourceRanges )}}
{{- with .Values.service.extraSpec }}
{{- toYaml . | nindent 2 }}
{{- end }}
{{- if (eq .Values.service.type "LoadBalancer") }}
{{- if .Values.service.loadBalancerIP }}
loadBalancerIP: {{ .Values.service.loadBalancerIP }}
{{- end }}
{{- if .Values.service.loadBalancerSourceRanges }}
loadBalancerSourceRanges:
{{- range .Values.service.loadBalancerSourceRanges }}
{{- range .Values.service.loadBalancerSourceRanges }}
- {{ . }}
{{- end }}
{{- end }}
{{- end }}
{{- end }}
ports:
{{- range .Values.ContainerPort }}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,19 @@ metadata:
{{- end }}
spec:
type: {{ .Values.service.type | default "ClusterIP" }}
{{- if (and (eq .Values.service.type "LoadBalancer") .Values.service.loadBalancerSourceRanges )}}
{{- with .Values.service.extraSpec }}
{{- toYaml . | nindent 2 }}
{{- end }}
{{- if (eq .Values.service.type "LoadBalancer") }}
{{- if .Values.service.loadBalancerIP }}
loadBalancerIP: {{ .Values.service.loadBalancerIP }}
{{- end }}
{{- if .Values.service.loadBalancerSourceRanges }}
loadBalancerSourceRanges:
{{- range .Values.service.loadBalancerSourceRanges }}
{{- range .Values.service.loadBalancerSourceRanges }}
- {{ . }}
{{- end }}
{{- end }}
{{- end }}
{{- end }}
ports:
{{- range .Values.ContainerPort }}
Expand Down
6 changes: 6 additions & 0 deletions scripts/sql/34003900_aws_retagging.down.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
DELETE FROM plugin_step_variable WHERE plugin_step_id=(SELECT id FROM plugin_metadata WHERE name='AWS ECR Retag' and plugin_version='1.0.0');
DELETE FROM plugin_step where plugin_id=(SELECT id FROM plugin_metadata WHERE name='AWS ECR Retag' and plugin_version='1.0.0');
DELETE FROM plugin_pipeline_script where id=(SELECT id FROM plugin_metadata WHERE name='AWS ECR Retag');
DELETE FROM plugin_stage_mapping where plugin_id=(SELECT id from plugin_metadata where name='AWS ECR Retag');
DELETE FROM plugin_metadata where name='AWS ECR Retag';
DELETE FROM plugin_parent_metadata where name='AWS ECR Retag';
65 changes: 65 additions & 0 deletions scripts/sql/34003900_aws_retagging.up.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
INSERT INTO "plugin_parent_metadata" ("id", "name","identifier", "description","type","icon","deleted", "created_on", "created_by", "updated_on", "updated_by")
VALUES (nextval('id_seq_plugin_parent_metadata'), 'AWS ECR Retag','aws-retag','AWS ECR Retag plugin that enables retagging of container images within ECR','PRESET','https://raw.githubusercontent.com/devtron-labs/devtron/main/assets/plugin-icons/ic-plugin-aws-ecr-retag.png','f', 'now()', 1, 'now()', 1);


INSERT INTO "plugin_metadata" ("id", "name", "description","deleted", "created_on", "created_by", "updated_on", "updated_by","plugin_parent_metadata_id","plugin_version","is_deprecated","is_latest")
VALUES (nextval('id_seq_plugin_metadata'), 'AWS ECR Retag','Retag your ECR image with AWS ECR Retag','f', 'now()', 1, 'now()', 1, (SELECT id FROM plugin_parent_metadata WHERE identifier='aws-retag'),'1.0.0', false, true);

INSERT INTO "plugin_stage_mapping" ("plugin_id","stage_type","created_on", "created_by", "updated_on", "updated_by")
VALUES ((SELECT id FROM plugin_metadata WHERE plugin_version='1.0.0' and name='AWS ECR Retag' and deleted= false),0,'now()', 1, 'now()', 1);

INSERT INTO "plugin_pipeline_script" ("id", "script","type","deleted","created_on", "created_by", "updated_on", "updated_by")VALUES (
nextval('id_seq_plugin_pipeline_script'),
E'
#!/bin/sh
set -eo pipefail
#set -v ## uncomment this to debug the script
if [[ "$AwsEcrFixedTag" && "$AwsEcrTagPrefix" ]];then
echo "Please provide only one input"
exit 1;
elif [[ $AwsEcrFixedTag ]]; then
Tag=$AwsEcrFixedTag
elif [[ $AwsEcrTagPrefix ]]; then
Tag=$AwsEcrTagPrefix-$DOCKER_IMAGE_TAG
else
echo "No Tags Provided for retagging"
fi
echo $Tag
AwsAccessKey="${AwsAccessEcrKey:-$(echo "$CI_CD_EVENT" | jq -r \'.commonWorkflowRequest.accessKey\')}"
AwsSecretKey="${AwsSecretEcrKey:-$(echo "$CI_CD_EVENT" | jq -r \'.commonWorkflowRequest.secretKey\')}"
mkdir -p ~/.aws
echo -e "\n[tag-profile]\naws_access_key_id = $AwsAccessKey\naws_secret_access_key =$AwsSecretKey" >> ~/.aws/credentials
if [[ $AwsAccessKey ]]; then
export AWS_PROFILE=tag-profile
fi
pipeline_type=$(echo $CI_CD_EVENT | jq -r \'.type\')
Region=$(echo $CI_CD_EVENT | jq -r .commonWorkflowRequest.dockerRegistryURL | sed \'s|https://||\'| awk -F. \'{print $4}\')

echo "************* Starting the AWS ECR Retag plugin *******************"
if [[ "$pipeline_type" == "CI" ]]; then
image_repo=$(echo $CI_CD_EVENT | jq -r .commonWorkflowRequest.dockerRepository)
image_tag=$(echo $CI_CD_EVENT | jq -r .commonWorkflowRequest.dockerImageTag)
MANIFEST=$(aws ecr batch-get-image --repository-name $image_repo --image-ids imageTag=$image_tag --region $Region --output text --query \'images[].imageManifest\')
aws ecr put-image --repository-name $image_repo --image-tag=$Tag --image-manifest "$MANIFEST" --region $Region
elif [[ "$pipeline_type" == "CD" ]]; then
image_repo=$(echo $CI_CD_EVENT | jq -r .commonWorkflowRequest.ciArtifactDTO.image | cut -d\'/\' -f2 | cut -d\':\' -f1)
image_tag=$(echo $CI_CD_EVENT | jq -r .commonWorkflowRequest.ciArtifactDTO.image | cut -d \':\' -f2)
MANIFEST=$(aws ecr batch-get-image --repository-name $image_repo --image-ids imageTag=$image_tag --region $Region --output text --query \'images[].imageManifest\')
aws ecr put-image --repository-name $image_repo --image-tag=$Tag --image-manifest "$MANIFEST" --region $Region
fi
if [ $? -ne 0 ]; then
echo "*************Failed to Retag the image****************"
else
echo "*************Image Retag is done sucessfully*********************"
fi
' ,'SHELL','f','now()',1,'now()',1);


INSERT INTO "plugin_step" ("id", "plugin_id","name","description","index","step_type","script_id","deleted", "created_on", "created_by", "updated_on", "updated_by")
VALUES (nextval('id_seq_plugin_step'), (SELECT id FROM plugin_metadata WHERE name='AWS ECR Retag' AND plugin_version='1.0.0' AND deleted= false),'Step 1','Runnig the plugin','1','INLINE',(SELECT last_value FROM id_seq_plugin_pipeline_script),'f','now()', 1, 'now()', 1);

INSERT INTO plugin_step_variable (id,plugin_step_id,name,format,description,is_exposed,allow_empty_value,default_value,value,variable_type,value_type,previous_step_index,variable_step_index,variable_step_index_in_plugin,reference_variable_name,deleted,created_on,created_by,updated_on,updated_by)
VALUES (nextval('id_seq_plugin_step_variable'),(SELECT ps.id FROM plugin_metadata p inner JOIN plugin_step ps on ps.plugin_id=p.id WHERE p.name='AWS ECR Retag' and p.plugin_version='1.0.0' and ps."index"=1 and ps.deleted=false),'AwsEcrFixedTag','STRING','Provide the fixed tag for retagging','t','t',null,null,'INPUT','NEW',null,1,null,null,'f','now()',1,'now()',1),
(nextval('id_seq_plugin_step_variable'),(SELECT ps.id FROM plugin_metadata p inner JOIN plugin_step ps on ps.plugin_id=p.id WHERE p.name='AWS ECR Retag' and p.plugin_version='1.0.0' and ps."index"=1 and ps.deleted=false),'AwsEcrTagPrefix','STRING','Provide the tag prefix','t','t',null,null,'INPUT','NEW',null,1,null,null,'f','now()',1,'now()',1),
(nextval('id_seq_plugin_step_variable'),(SELECT ps.id FROM plugin_metadata p inner JOIN plugin_step ps on ps.plugin_id=p.id WHERE p.name='AWS ECR Retag' and p.plugin_version='1.0.0' and ps."index"=1 and ps.deleted=false),'AwsAccessEcrKey','STRING','Provide the access key with ECR permission','t','t',null,null,'INPUT','NEW',null,1,null,null,'f','now()',1,'now()',1),
(nextval('id_seq_plugin_step_variable'),(SELECT ps.id FROM plugin_metadata p inner JOIN plugin_step ps on ps.plugin_id=p.id WHERE p.name='AWS ECR Retag' and p.plugin_version='1.0.0' and ps."index"=1 and ps.deleted=false),'AwsSecretEcrKey','STRING','Provide the secret key with ECR permission','t','t',null,null,'INPUT','NEW',null,1,null,null,'f','now()',1,'now()',1);
Loading