From 2960b0ab8f2415fe5f2edfcc6e88ab5e7fa5b305 Mon Sep 17 00:00:00 2001 From: Sandeep Date: Tue, 12 Jul 2022 11:11:17 +0530 Subject: [PATCH 01/31] Support for Docker image to build the code --- builder/Dockerfile.builder | 5 +++++ builder/build.sh | 6 ++++++ 2 files changed, 11 insertions(+) create mode 100644 builder/Dockerfile.builder create mode 100755 builder/build.sh diff --git a/builder/Dockerfile.builder b/builder/Dockerfile.builder new file mode 100644 index 00000000..24cf7827 --- /dev/null +++ b/builder/Dockerfile.builder @@ -0,0 +1,5 @@ +FROM maven:3.3-jdk-8 + +COPY build.sh . + +ENTRYPOINT [ "./build.sh" ] \ No newline at end of file diff --git a/builder/build.sh b/builder/build.sh new file mode 100755 index 00000000..f5597625 --- /dev/null +++ b/builder/build.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +echo "I'll build the code" +sleep $SLEEP_DURATION + +echo "Code building done" From 7c7a6ef71224d2626c9d648fb1f4aa6a7e894b14 Mon Sep 17 00:00:00 2001 From: Sandeep Date: Tue, 12 Jul 2022 11:15:05 +0530 Subject: [PATCH 02/31] Added code for building the code --- builder/build.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/builder/build.sh b/builder/build.sh index f5597625..b844420f 100755 --- a/builder/build.sh +++ b/builder/build.sh @@ -3,4 +3,6 @@ echo "I'll build the code" sleep $SLEEP_DURATION +cd $CODEBASE_DIR +mvn $INSTRUCTION echo "Code building done" From 2c2152cd3bd885dd431eed6445abd8aeea204d69 Mon Sep 17 00:00:00 2001 From: Sandeep Date: Tue, 12 Jul 2022 11:17:41 +0530 Subject: [PATCH 03/31] REnamed dockerfile --- builder/{Dockerfile.builder => Dockerfile} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename builder/{Dockerfile.builder => Dockerfile} (100%) diff --git a/builder/Dockerfile.builder b/builder/Dockerfile similarity index 100% rename from builder/Dockerfile.builder rename to builder/Dockerfile From 55f5177e98182b5cdc78b5df15e29943ebfaa72e Mon Sep 17 00:00:00 2001 From: Sandeep Date: Tue, 12 Jul 2022 15:33:31 +0530 Subject: [PATCH 04/31] Changes for intergration with BP Step Catalog --- builder/Dockerfile | 3 ++- builder/build.sh | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/builder/Dockerfile b/builder/Dockerfile index 24cf7827..625f7e97 100644 --- a/builder/Dockerfile +++ b/builder/Dockerfile @@ -1,5 +1,6 @@ FROM maven:3.3-jdk-8 COPY build.sh . +ENV ACTIVITY_SUB_TASK_CODE MVN_EXECUTE -ENTRYPOINT [ "./build.sh" ] \ No newline at end of file +ENTRYPOINT [ "./build.sh" ] diff --git a/builder/build.sh b/builder/build.sh index b844420f..629c3f39 100755 --- a/builder/build.sh +++ b/builder/build.sh @@ -6,3 +6,10 @@ sleep $SLEEP_DURATION cd $CODEBASE_DIR mvn $INSTRUCTION echo "Code building done" + +OUTPUT_DIR=${EXECUTION_DIR}/${EXECUTION_TASK_ID} + +echo '{"mvn_execute": {"status": false, "message": "failed to apply infrastructure via terraform : a null object was created, instead of terraform object"}}' > ${OUTPUT_DIR}/summary.json + +echo '{"status": false, "message": "failed to apply infrastructure via terraform : a null object was created, instead of terraform object"}' > ${OUTPUT_DIR}/mvn_execute.output + From eb987c865b6cfd1971fdee3448292ddf8f8ce4ab Mon Sep 17 00:00:00 2001 From: Sandeep Date: Tue, 12 Jul 2022 15:38:00 +0530 Subject: [PATCH 05/31] Update default status to scuccess --- builder/build.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/builder/build.sh b/builder/build.sh index 629c3f39..62d9ead0 100755 --- a/builder/build.sh +++ b/builder/build.sh @@ -9,7 +9,7 @@ echo "Code building done" OUTPUT_DIR=${EXECUTION_DIR}/${EXECUTION_TASK_ID} -echo '{"mvn_execute": {"status": false, "message": "failed to apply infrastructure via terraform : a null object was created, instead of terraform object"}}' > ${OUTPUT_DIR}/summary.json +echo '{"mvn_execute": {"status": true, "message": "Dekha chal gaya"}}' > ${OUTPUT_DIR}/summary.json -echo '{"status": false, "message": "failed to apply infrastructure via terraform : a null object was created, instead of terraform object"}' > ${OUTPUT_DIR}/mvn_execute.output +echo '{"status": true, "message": "Dekha chal gaya"}' > ${OUTPUT_DIR}/mvn_execute.output From 988f8bac406d2021fc98ce3fe57fc3c26044ca26 Mon Sep 17 00:00:00 2001 From: neha Date: Wed, 13 Jul 2022 13:05:48 +0530 Subject: [PATCH 06/31] adding generateoutput in bash.sh --- builder/Dockerfile | 6 +++--- builder/build.sh | 36 ++++++++++++++++++++++++++++++------ 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/builder/Dockerfile b/builder/Dockerfile index 625f7e97..ae35df23 100644 --- a/builder/Dockerfile +++ b/builder/Dockerfile @@ -1,6 +1,6 @@ FROM maven:3.3-jdk-8 - +RUN apt-get update || true +RUN apt-get install jq COPY build.sh . ENV ACTIVITY_SUB_TASK_CODE MVN_EXECUTE - -ENTRYPOINT [ "./build.sh" ] +ENTRYPOINT [ "./build.sh" ] \ No newline at end of file diff --git a/builder/build.sh b/builder/build.sh index 62d9ead0..5295703b 100755 --- a/builder/build.sh +++ b/builder/build.sh @@ -1,15 +1,39 @@ #!/bin/bash +#!/bin/bash + +generateOutput() { + Task=$1 + Status=$2 + Message=$3 + OUTPUT_DIR=/src/${EXECUTION_DIR}/${EXECUTION_TASK_ID} + mkdir -p ${OUTPUT_DIR} + echo "{ \"${Task}\": {\"status\": \"${Status}\", \"message\": \"${Message}\"}}" | jq . > ${OUTPUT_DIR}/summary.json + echo "{ \"status\": \"${Status}\", \"message\": \"${Message}\"}" | jq . > ${OUTPUT_DIR}/${Task}.json + } + echo "I'll build the code" -sleep $SLEEP_DURATION +sleep $SLEEP_DURATION -cd $CODEBASE_DIR +cd $CODEBASE_DIR mvn $INSTRUCTION -echo "Code building done" +if [ $? -eq 0 ] +then +generateOutput mvn_execute true "dhek chal gya" +echo "build sucessfull" +elif [ $? != 0 ] +then +generateOutput mvn_execute false "nhi chala" +echo "build unsucessfull" +fi + + + + + + + -OUTPUT_DIR=${EXECUTION_DIR}/${EXECUTION_TASK_ID} -echo '{"mvn_execute": {"status": true, "message": "Dekha chal gaya"}}' > ${OUTPUT_DIR}/summary.json -echo '{"status": true, "message": "Dekha chal gaya"}' > ${OUTPUT_DIR}/mvn_execute.output From c3c62d9b3e48a91b9eb7a3c5a5de5703ee399882 Mon Sep 17 00:00:00 2001 From: Sandeep Date: Wed, 13 Jul 2022 16:18:02 +0530 Subject: [PATCH 07/31] Basic refactoring --- builder/Dockerfile | 1 + builder/build.sh | 21 +++++---------------- builder/functions.sh | 9 +++++++++ 3 files changed, 15 insertions(+), 16 deletions(-) create mode 100644 builder/functions.sh diff --git a/builder/Dockerfile b/builder/Dockerfile index ae35df23..9fd607c8 100644 --- a/builder/Dockerfile +++ b/builder/Dockerfile @@ -1,6 +1,7 @@ FROM maven:3.3-jdk-8 RUN apt-get update || true RUN apt-get install jq +ENV SLEEP_DURATION 5s COPY build.sh . ENV ACTIVITY_SUB_TASK_CODE MVN_EXECUTE ENTRYPOINT [ "./build.sh" ] \ No newline at end of file diff --git a/builder/build.sh b/builder/build.sh index 5295703b..662859bf 100755 --- a/builder/build.sh +++ b/builder/build.sh @@ -1,16 +1,5 @@ #!/bin/bash - -#!/bin/bash - -generateOutput() { - Task=$1 - Status=$2 - Message=$3 - OUTPUT_DIR=/src/${EXECUTION_DIR}/${EXECUTION_TASK_ID} - mkdir -p ${OUTPUT_DIR} - echo "{ \"${Task}\": {\"status\": \"${Status}\", \"message\": \"${Message}\"}}" | jq . > ${OUTPUT_DIR}/summary.json - echo "{ \"status\": \"${Status}\", \"message\": \"${Message}\"}" | jq . > ${OUTPUT_DIR}/${Task}.json - } +source functions.sh echo "I'll build the code" sleep $SLEEP_DURATION @@ -19,12 +8,12 @@ cd $CODEBASE_DIR mvn $INSTRUCTION if [ $? -eq 0 ] then -generateOutput mvn_execute true "dhek chal gya" -echo "build sucessfull" + generateOutput mvn_execute true "dhek chal gya" + echo "build sucessfull" elif [ $? != 0 ] then -generateOutput mvn_execute false "nhi chala" -echo "build unsucessfull" + generateOutput mvn_execute false "nhi chala" + echo "build unsucessfull" fi diff --git a/builder/functions.sh b/builder/functions.sh new file mode 100644 index 00000000..d0d6d2a2 --- /dev/null +++ b/builder/functions.sh @@ -0,0 +1,9 @@ +generateOutput() { + Task=$1 + Status=$2 + Message=$3 + OUTPUT_DIR=/src/${EXECUTION_DIR}/${EXECUTION_TASK_ID} + mkdir -p ${OUTPUT_DIR} + echo "{ \"${Task}\": {\"status\": \"${Status}\", \"message\": \"${Message}\"}}" | jq . > ${OUTPUT_DIR}/summary.json + echo "{ \"status\": \"${Status}\", \"message\": \"${Message}\"}" | jq . > ${OUTPUT_DIR}/${Task}.json +} From dc3bfee893ea6133081910156acf55258e390825 Mon Sep 17 00:00:00 2001 From: neha Date: Thu, 14 Jul 2022 15:13:01 +0530 Subject: [PATCH 08/31] adding packer code --- war_packer/packer_build.json | 47 ++++++++++++++++++++++++++++++++++++ war_packer/variable.json | 11 +++++++++ 2 files changed, 58 insertions(+) create mode 100644 war_packer/packer_build.json create mode 100644 war_packer/variable.json diff --git a/war_packer/packer_build.json b/war_packer/packer_build.json new file mode 100644 index 00000000..6df620d6 --- /dev/null +++ b/war_packer/packer_build.json @@ -0,0 +1,47 @@ +{ + + "builders": [ + { + "type": "amazon-ebs", + "access_key":"{{user `access_key`}}", + "secret_key":"{{user `secret_key`}}", + "region": "{{user `region`}}", + "source_ami": "{{user `source_ami`}}", + "instance_type": "{{user `instance_type`}}", + "ssh_username": "{{user `ssh_username`}}", + "ami_name": "{{user `ami_name`}}-{{timestamp}}", + "vpc_id": "{{user `vpc_id`}}", + "subnet_id": "{{user `subnet_id`}}", + "security_group_id": "{{user `security_group_id`}}", + "skip_region_validation": true, + "associate_public_ip_address": true, + "tags": { + "Name": "{{user `ami_name`}}-{{timestamp}}", + "Environment": "testing", + "Type": "java application" + } + } + ], + + "provisioners": [ + + { + "type": "shell", + "inline": ["sleep 30"] + }, + + { + "type": "file", + "source": "../target/Spring3HibernateApp.war", + "destination": "/tmp/" + }, + { + "type": "shell", + "inline": [ + "sudo mv /tmp/Spring3HibernateApp.war /home/ubuntu/Spring3HibernateApp.war" + ] + } + + + ] + } \ No newline at end of file diff --git a/war_packer/variable.json b/war_packer/variable.json new file mode 100644 index 00000000..184a6cff --- /dev/null +++ b/war_packer/variable.json @@ -0,0 +1,11 @@ +{ + "region": "us-east-1", + "source_ami": "ami-08d4ac5b634553e16", + "instance_type": "t2.micro", + "ssh_username": "ubuntu", + "ami_name": "golden-ami", + "vpc_id": "vpc-05871ac65902b7cf2", + "subnet_id": "subnet-088c1cf6538664b46", + "security_group_ids": "sg-09ee213535df15b6b", + "ami_virtualization_type": "hvm" +} From be4b1264f84b94f84e19721f28f6462d2e81c029 Mon Sep 17 00:00:00 2001 From: neha Date: Fri, 15 Jul 2022 18:56:47 +0530 Subject: [PATCH 09/31] adding terraform code --- terraform_code/main.tf | 135 ++++++++++++++++++++++++++++++++ terraform_code/output.tf | 24 ++++++ terraform_code/terraform.tfvars | 18 +++++ terraform_code/var.tf | 122 +++++++++++++++++++++++++++++ 4 files changed, 299 insertions(+) create mode 100644 terraform_code/main.tf create mode 100644 terraform_code/output.tf create mode 100644 terraform_code/terraform.tfvars create mode 100644 terraform_code/var.tf diff --git a/terraform_code/main.tf b/terraform_code/main.tf new file mode 100644 index 00000000..8e1021ea --- /dev/null +++ b/terraform_code/main.tf @@ -0,0 +1,135 @@ +provider "aws" { + region = var.region + default_tags { + tags = var.default_tags + } + + +} +data "aws_ami" "java-spring3Hibernateapplication" { +most_recent = true +owners = ["727357989976"] # Canonical + + filter { + name = "tag:Name" + values = ["golden-ami-*"] + } + + filter { + name = "virtualization-type" + values = ["hvm"] + } + filter { + name = "tag:Type" + values = ["java application"] + } +} + + +data "http" "ip" { + url = "https://ifconfig.me" +} + +module "vpc" { + source = "terraform-aws-modules/vpc/aws" + name = var.vpc_name + cidr = var.vpc_cidr + azs = var.az + private_subnets = var.private_subnets + public_subnets = var.public_subnets + enable_nat_gateway = var.enable_nat_gateway + +} + + +module "sonarqube-bastion-security-group" { + source = "terraform-aws-modules/security-group/aws" + name = var.bastion_sg_name + description = "Security group for user-service with custom ports open within VPC" + vpc_id = module.vpc.vpc_id + ingress_cidr_blocks = [join("/", [data.http.ip.body, "32"])] + ingress_rules = ["ssh-tcp", ] + egress_rules = ["all-all"] + ingress_with_cidr_blocks = var.ingress_with_cidr_blocks + +} + +module "ec2_instance_public" { + source = "terraform-aws-modules/ec2-instance/aws" + count = length(module.vpc.public_subnets) + ami = data.aws_ami.java-spring3Hibernateapplication.id + instance_type = var.public_ec2_type + subnet_id = module.vpc.public_subnets[0] + vpc_security_group_ids = [module.sonarqube-bastion-security-group.security_group_id] + key_name = var.key_name + name = tostring(join("_", [var.public_instance_name,count.index])) + iam_instance_profile = var.profile_name + + +} + + +module "sonarqube-private-security-group" { + source = "terraform-aws-modules/security-group/aws" + vpc_id = module.vpc.vpc_id + ingress_cidr_blocks = var.public_subnets + ingress_rules = ["ssh-tcp"] + egress_rules = ["all-all"] + ingress_with_cidr_blocks = var.ingress_with_cidr_blocks_database + name = var.private_sg_name + + +} + +module "ec2_instance_private" { + source = "terraform-aws-modules/ec2-instance/aws" + count = length(module.vpc.private_subnets) + ami = data.aws_ami.java-spring3Hibernateapplication.id + instance_type = var.private_ec2_type + subnet_id = module.vpc.private_subnets[count.index] + vpc_security_group_ids = [module.sonarqube-private-security-group.security_group_id] + key_name = var.key_name + name = tostring(join("_", [var.private_instance_name, count.index])) + +} + + + +module "alb" { + source = "terraform-aws-modules/alb/aws" + version = "~> 6.0" + + name = "my-alb" + + load_balancer_type = "application" + + vpc_id = module.vpc.vpc_id + subnets = [module.vpc.public_subnets[0], module.vpc.public_subnets[1]] + security_groups = [module.sonarqube-bastion-security-group.security_group_id] + + + target_groups = [ + { + name_prefix = "pref-" + backend_protocol = "HTTP" + backend_port = 9000 + target_type = "instance" + targets = [ + { + target_id = module.ec2_instance_private[0].id + } + + ] + } + ] + + #http_listeners = var.http_listeners + + + http_tcp_listeners = var.http_tcp_listeners + + + tags = { + Environment = "Test" + } +} diff --git a/terraform_code/output.tf b/terraform_code/output.tf new file mode 100644 index 00000000..71a59cdb --- /dev/null +++ b/terraform_code/output.tf @@ -0,0 +1,24 @@ +output "vpc" { + value = module.vpc.vpc_id +} + + +output "sonarqube-bastion-security-group" { + value = module.sonarqube-bastion-security-group +} + +output "sonarqube-private-security-group" { + value = module.sonarqube-private-security-group +} + +output "ec2_instance_private" { + value = module.ec2_instance_private +} + +output "ec2_instance_public_ip" { + value = module.ec2_instance_public +} + +output "ip" { + value = data.http.ip.body +} diff --git a/terraform_code/terraform.tfvars b/terraform_code/terraform.tfvars new file mode 100644 index 00000000..ba90aadd --- /dev/null +++ b/terraform_code/terraform.tfvars @@ -0,0 +1,18 @@ +region = "us-east-1" +vpc_name = "sonarqube_vpc" +vpc_cidr = "10.0.0.0/16" +az = ["us-east-1a", "us-east-1b"] +private_subnets = ["10.0.3.0/24"] +public_subnets = ["10.0.1.0/24","10.0.2.0/24"] +enable_nat_gateway = true +public_ec2_type = "t2.micro" +key_name = "outlook" +private_ec2_type = "t2.micro" +default_tags = { ENV = "sonarqube", Company = "Opstree", Owner = "Neha Sinha" } +public_instance_name = "bastion" +private_instance_name = "Sonarqube-server" +bastion_sg_name = "bastion-sg" +private_sg_name = "Sonarqube-private-sg" +ingress_with_cidr_blocks = [{ from_port = 9000, to_port = 9000, protocol = "tcp", description = "Sonarqube", cidr_blocks = "0.0.0.0/0" },{ from_port = 80, to_port = 80, protocol = "tcp", description = "tcp 80", cidr_blocks = "0.0.0.0/0" }] +ingress_with_cidr_blocks_database = [{ from_port = 9000, to_port = 9000, protocol = "tcp" ,cidr_blocks = "0.0.0.0/0"}] +profile_name = "fullacces_jenkinsrole" diff --git a/terraform_code/var.tf b/terraform_code/var.tf new file mode 100644 index 00000000..9575bba7 --- /dev/null +++ b/terraform_code/var.tf @@ -0,0 +1,122 @@ +variable "region" { + type = string + default = "ap-south-1" + description = "Enter the region in which Infra will created" +} + +variable "vpc_name" { + type = string + default = "Sonarqube_vpc" + description = "Enter the VPC name" +} +variable "vpc_cidr" { + type = string + default = "10.0.0.0/16" + description = "Enter the vpc cidr" +} + +variable "bastion_sg_name" { + type = string + default = "Sonarqube-bastion-sg" + description = "Enter the security group name for bastion" +} + +variable "enable_nat_gateway" { + type = bool + default = true + description = "Enter the value for NAT true/false" +} +variable "az" { + type = list(string) + default = ["ap-south-1a", "ap-south-1b", "ap-south-1c"] + description = "Enter the Availability Zones" +} +variable "private_subnets" { + type = list(string) + default = ["10.0.3.0/24"] + description = "Enter the private subnets cidr" +} + +variable "public_subnets" { + type = list(string) + default = ["10.0.1.0/24","10.0.2.0/24"] + description = "Enter the public subnet cidr" +} + +variable "public_ec2_type" { + type = string + default = "t2.micro" + description = "Enter the public ec2 types" +} +variable "key_name" { + type = string + default = "ansiblehost" + description = "Enter the public instance key name" +} + + +variable "private_ec2_type" { + type = string + default = "t2.medium" + description = "Enter the private ec2 types" +} + +# variable "ami_id" { +# type = string +# default = "ami-0c1a7f89451184c8b" +# description = "Enter the ami_id" +# } + +variable "default_tags" { + type = map(any) + default = { ENV = "Sonarqube", Owner = "Neha Sinha", company = "Opstree" } + description = "Enter the tags" +} + +variable "public_instance_name" { + type = string + default = "Sonarqube-Bastion" + description = "Enter the bastion name" +} +variable "private_instance_name" { + type = string + default = "Sonarqube-server" + description = "Enter the bastion name" +} + +variable "private_sg_name" { + type = string + default = "Sonarqube-private-sg" + description = "Enter the private security group name" +} +locals { + ip = data.http.ip +} + + variable "ingress_with_cidr_blocks" { +type = list(any) +default = [{ from_port = 22, to_port = 22, protocol = "tcp", description = "Public Access", cidr_blocks = "0.0.0.0/0" }] +description = "Enter the ports and cidrs you want to open" +} + + +variable "ingress_with_cidr_blocks_database" { + type = list(any) + default = [{ from_port = 22, to_port = 22, protocol = "tcp", description = "By Bastion Access", cidr_blocks = "12.0.101.0/24" }] + description = "Enter the ports and cidrs you want to open" +} +#variable "http_listeners" { +#type = list(any) +#default = [{ port = 9000, protocol = "HTTP", target_group_index = 0 }] + +#} +variable "http_tcp_listeners" { + type = list(any) + default = [{ port = 80, protocol = "HTTP", target_group_index = 0 }] + +} +variable "profile_name" { + type = string + description = "Enter the profile name" + default = "sonarquberole" +} From d72132bf5d45f4576508c6ed1112d16479dced2b Mon Sep 17 00:00:00 2001 From: neha-sinha20 <102357600+neha-sinha20@users.noreply.github.com> Date: Thu, 6 Oct 2022 11:20:04 +0530 Subject: [PATCH 10/31] Update variable.json updating variable in variale.json of war_packer --- war_packer/variable.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/war_packer/variable.json b/war_packer/variable.json index 184a6cff..bf4ffca6 100644 --- a/war_packer/variable.json +++ b/war_packer/variable.json @@ -1,11 +1,11 @@ { - "region": "us-east-1", - "source_ami": "ami-08d4ac5b634553e16", + "region": "ap-south-1", + "source_ami": "ami-024c319d5d14b463e", "instance_type": "t2.micro", "ssh_username": "ubuntu", - "ami_name": "golden-ami", - "vpc_id": "vpc-05871ac65902b7cf2", - "subnet_id": "subnet-088c1cf6538664b46", - "security_group_ids": "sg-09ee213535df15b6b", + "ami_name": "spring3hibernate-ami", + "vpc_id": "vpc-0928ca75a3d30c971", + "subnet_id": "subnet-086ad3db8e3652bba", + "security_group_ids": "sg-00bdb012b89ee9e6e", "ami_virtualization_type": "hvm" } From 420aabf565f6bc613c6941af4c6d20b6fbb658a6 Mon Sep 17 00:00:00 2001 From: neha-sinha20 <102357600+neha-sinha20@users.noreply.github.com> Date: Thu, 6 Oct 2022 14:57:26 +0530 Subject: [PATCH 11/31] Update main.tf updating ami tag name in main.tf --- terraform_code/main.tf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/terraform_code/main.tf b/terraform_code/main.tf index 8e1021ea..d6bda473 100644 --- a/terraform_code/main.tf +++ b/terraform_code/main.tf @@ -8,11 +8,11 @@ provider "aws" { } data "aws_ami" "java-spring3Hibernateapplication" { most_recent = true -owners = ["727357989976"] # Canonical +owners = ["062711695447"] # Canonical filter { name = "tag:Name" - values = ["golden-ami-*"] + values = ["spring3hibernate-ami-*"] } filter { From de71885c9bd3406d7aae096170f6bd89c2830cce Mon Sep 17 00:00:00 2001 From: neha-sinha20 <102357600+neha-sinha20@users.noreply.github.com> Date: Thu, 6 Oct 2022 15:03:05 +0530 Subject: [PATCH 12/31] Update terraform.tfvars --- terraform_code/terraform.tfvars | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/terraform_code/terraform.tfvars b/terraform_code/terraform.tfvars index ba90aadd..2aa0cccd 100644 --- a/terraform_code/terraform.tfvars +++ b/terraform_code/terraform.tfvars @@ -1,12 +1,12 @@ -region = "us-east-1" +region = "ap-south-1" vpc_name = "sonarqube_vpc" vpc_cidr = "10.0.0.0/16" -az = ["us-east-1a", "us-east-1b"] +az = ["ap-south-1a", "ap-south-1b"] private_subnets = ["10.0.3.0/24"] public_subnets = ["10.0.1.0/24","10.0.2.0/24"] enable_nat_gateway = true public_ec2_type = "t2.micro" -key_name = "outlook" +key_name = "grafana" private_ec2_type = "t2.micro" default_tags = { ENV = "sonarqube", Company = "Opstree", Owner = "Neha Sinha" } public_instance_name = "bastion" @@ -15,4 +15,4 @@ bastion_sg_name = "bastion-sg" private_sg_name = "Sonarqube-private-sg" ingress_with_cidr_blocks = [{ from_port = 9000, to_port = 9000, protocol = "tcp", description = "Sonarqube", cidr_blocks = "0.0.0.0/0" },{ from_port = 80, to_port = 80, protocol = "tcp", description = "tcp 80", cidr_blocks = "0.0.0.0/0" }] ingress_with_cidr_blocks_database = [{ from_port = 9000, to_port = 9000, protocol = "tcp" ,cidr_blocks = "0.0.0.0/0"}] -profile_name = "fullacces_jenkinsrole" +profile_name = "kafka_role" From 74631e7506da1d1f2e4abdbe7533ec270ea1e186 Mon Sep 17 00:00:00 2001 From: neha-sinha20 <102357600+neha-sinha20@users.noreply.github.com> Date: Thu, 6 Oct 2022 18:17:32 +0530 Subject: [PATCH 13/31] Create backend.tf adding backend.tf in terraform_code --- terraform_code/backend.tf | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 terraform_code/backend.tf diff --git a/terraform_code/backend.tf b/terraform_code/backend.tf new file mode 100644 index 00000000..b4942bb7 --- /dev/null +++ b/terraform_code/backend.tf @@ -0,0 +1,7 @@ +terraform { + backend "s3" { + bucket = "bp-tf-states" + key = "env/testing/bp.tfstate" + region = "ap-south-1" + } +} From ade71a8db3b40044d35f8e197af28e3d222c0d05 Mon Sep 17 00:00:00 2001 From: neha-sinha20 <102357600+neha-sinha20@users.noreply.github.com> Date: Fri, 7 Oct 2022 10:39:03 +0530 Subject: [PATCH 14/31] Delete backend.tf deleting backend.tf --- terraform_code/backend.tf | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 terraform_code/backend.tf diff --git a/terraform_code/backend.tf b/terraform_code/backend.tf deleted file mode 100644 index b4942bb7..00000000 --- a/terraform_code/backend.tf +++ /dev/null @@ -1,7 +0,0 @@ -terraform { - backend "s3" { - bucket = "bp-tf-states" - key = "env/testing/bp.tfstate" - region = "ap-south-1" - } -} From af7907356d134d4c714f0c45c1b81e0235bd56b4 Mon Sep 17 00:00:00 2001 From: neha-sinha20 <102357600+neha-sinha20@users.noreply.github.com> Date: Fri, 7 Oct 2022 10:51:46 +0530 Subject: [PATCH 15/31] adding backend.tf in terrafrom code --- terraform_code/backend.tf | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 terraform_code/backend.tf diff --git a/terraform_code/backend.tf b/terraform_code/backend.tf new file mode 100644 index 00000000..b4942bb7 --- /dev/null +++ b/terraform_code/backend.tf @@ -0,0 +1,7 @@ +terraform { + backend "s3" { + bucket = "bp-tf-states" + key = "env/testing/bp.tfstate" + region = "ap-south-1" + } +} From fb2d04a5cce3abb9010d064d5aada7cf957eed03 Mon Sep 17 00:00:00 2001 From: Sandeep Date: Mon, 17 Oct 2022 12:30:00 +0530 Subject: [PATCH 16/31] Added a global licenecy meta file --- doc/dependency_decisions.yml | 61 ++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 doc/dependency_decisions.yml diff --git a/doc/dependency_decisions.yml b/doc/dependency_decisions.yml new file mode 100644 index 00000000..5134452f --- /dev/null +++ b/doc/dependency_decisions.yml @@ -0,0 +1,61 @@ +--- +- - :permit + - MIT + - :who: + :why: + :versions: [] + :when: 2022-10-17 06:50:29.255601214 Z +- - :permit + - Apache 2.0 + - :who: + :why: + :versions: [] + :when: 2022-10-17 06:54:27.256049185 Z +- - :permit + - Common Development and Distribution License 1.0 + - :who: + :why: + :versions: [] + :when: 2022-10-17 06:55:07.637942543 Z +- - :permit + - The GNU General Public License, Version 2 + - :who: + :why: + :versions: [] + :when: 2022-10-17 06:55:26.727717107 Z +- - :permit + - LGPL + - :who: + :why: + :versions: [] + :when: 2022-10-17 06:55:58.022044091 Z +- - :permit + - GNU LESSER GENERAL PUBLIC LICENSE + - :who: + :why: + :versions: [] + :when: 2022-10-17 06:56:09.078335004 Z +- - :permit + - Common Public License Version 1.0 + - :who: + :why: + :versions: [] + :when: 2022-10-17 06:56:20.370905240 Z +- - :permit + - CDDL + GPLv2 with classpath exception + - :who: + :why: + :versions: [] + :when: 2022-10-17 06:56:32.140297451 Z +- - :permit + - GNU Lesser General Public License, version 2.1 + - :who: + :why: + :versions: [] + :when: 2022-10-17 06:57:00.424897761 Z +- - :permit + - Public Domain + - :who: + :why: + :versions: [] + :when: 2022-10-17 06:57:09.597364315 Z From 7f8d7ff530e9e7667a87b26260936e342d2f839a Mon Sep 17 00:00:00 2001 From: Sandeep Date: Mon, 17 Oct 2022 17:37:07 +0530 Subject: [PATCH 17/31] Added sonar.properties --- sonar.properties | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 sonar.properties diff --git a/sonar.properties b/sonar.properties new file mode 100644 index 00000000..1b1e3cea --- /dev/null +++ b/sonar.properties @@ -0,0 +1,4 @@ +sonar.host.url=https://sonarcloud.io/ +sonar.projectKey=s3ha +sonar.organization=ot-bp +sonar.java.binaries=target From 6ad0786c82db9ffc36558807b11b640297eba173 Mon Sep 17 00:00:00 2001 From: priyanshichauhan0707 Date: Wed, 26 Oct 2022 18:48:13 +0530 Subject: [PATCH 18/31] gradle files --- .gradle/4.4.1/fileChanges/last-build.bin | Bin 0 -> 1 bytes .gradle/4.4.1/fileHashes/fileHashes.bin | Bin 0 -> 18697 bytes .gradle/4.4.1/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .gradle/4.4.1/taskHistory/taskHistory.bin | Bin 0 -> 19528 bytes .gradle/4.4.1/taskHistory/taskHistory.lock | Bin 0 -> 17 bytes .../buildOutputCleanup.lock | Bin 0 -> 17 bytes .gradle/buildOutputCleanup/cache.properties | 2 + .gradle/buildOutputCleanup/outputFiles.bin | Bin 0 -> 18695 bytes build.gradle | 78 ++++++++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 55627 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 172 ++++++++++++++++++ gradlew.bat | 84 +++++++++ settings.gradle | 1 + 14 files changed, 342 insertions(+) create mode 100644 .gradle/4.4.1/fileChanges/last-build.bin create mode 100644 .gradle/4.4.1/fileHashes/fileHashes.bin create mode 100644 .gradle/4.4.1/fileHashes/fileHashes.lock create mode 100644 .gradle/4.4.1/taskHistory/taskHistory.bin create mode 100644 .gradle/4.4.1/taskHistory/taskHistory.lock create mode 100644 .gradle/buildOutputCleanup/buildOutputCleanup.lock create mode 100644 .gradle/buildOutputCleanup/cache.properties create mode 100644 .gradle/buildOutputCleanup/outputFiles.bin create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle diff --git a/.gradle/4.4.1/fileChanges/last-build.bin b/.gradle/4.4.1/fileChanges/last-build.bin new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/.gradle/4.4.1/fileHashes/fileHashes.bin b/.gradle/4.4.1/fileHashes/fileHashes.bin new file mode 100644 index 0000000000000000000000000000000000000000..1789a19093e13d4dec77c2fa4445aad3db407e16 GIT binary patch literal 18697 zcmeI%&ntvM9LMq5%>ixe*{78~pm;81ZR>ZOh$7n-wUTlZoXxl$SUh0DxJT^C)FNL1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5crEg zpA2`(+2&5Gb$BI(90%|j_dynBTTlu8Ib@eocl}$`DPPYr$}<0CLGakOZ+JVVZ?~DzhaIG# zEJ!p%B(Nen1X5%q1VYd)2n0KH=~B=ws9Th$Y}fY|pIuV&5b+(@-PxVl-*4tKv!{&_ zQlii23Rx_h7ptg200Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##An?BkwEGiTmz_*W zc|lOwkRhb9$gj{!d)wK9^^fjnn;YxH{|DjKf4(Q%hBE{p009U<00Izz00bZa0SG_< z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0{?AFt0r%zoZk->zeY^T*0+*6d$DbsPgndy2`3C2w6 z37$^Xgja_rm`GcSnJHl1A`X9p^ucl~23HyB=(;r9si(?HGJN zOrA$RUtW9X%Urad&`DRMjI6X_dE8KzydaHGq$3Lzk1^X7{+cAIPOA5|^}l?5uWaVW z-G}2_oWGB-WPgOK`Wt#4#+pG(*beVyQA@JIr^^}t?q+{K2Hi)Fw$#T?G{oCm8(QLx zrnJ%>V!Z literal 0 HcmV?d00001 diff --git a/.gradle/4.4.1/taskHistory/taskHistory.lock b/.gradle/4.4.1/taskHistory/taskHistory.lock new file mode 100644 index 0000000000000000000000000000000000000000..6232ec75f8a3bf90a18c15bb88c7f345961e2347 GIT binary patch literal 17 TcmZS1=RVw#o+N-xcG9iEf0tg_0 z00IagfB*srAbOt{MqzOA9%$&*Ij&2~jI z`u$)(a@Tl`XT#E~+KW$xrTW0arSwznkIna;y^Grw>1pk6fti2>YXM`H)6;l#4^iuT0K>|!$GjYyx literal 0 HcmV?d00001 diff --git a/build.gradle b/build.gradle new file mode 100644 index 00000000..ba439e7b --- /dev/null +++ b/build.gradle @@ -0,0 +1,78 @@ +apply plugin: 'java' +apply plugin: 'maven' + +group = 'Spring3HibernateApp' +version = '1.8-SNAPSHOT' + +description = """Spring3HibernateApp""" + +sourceCompatibility = 1.6 +targetCompatibility = 1.6 + + + +repositories { + + maven { url "https://repo.maven.apache.org/maven2" } +} +dependencies { + compile group: 'org.mockito', name: 'mockito-all', version:'1.9.5' + compile group: 'javax.activation', name: 'activation', version:'1.1' + compile group: 'antlr', name: 'antlr', version:'2.7.6' + compile group: 'aopalliance', name: 'aopalliance', version:'1.0' + compile group: 'asm', name: 'asm', version:'1.5.3' + compile group: 'asm', name: 'asm-attrs', version:'1.5.3' + compile group: 'cglib', name: 'cglib', version:'2.1_3' + compile group: 'commons-beanutils', name: 'commons-beanutils', version:'1.7.0' + compile group: 'commons-io', name: 'commons-io', version:'1.1' + compile group: 'commons-logging', name: 'commons-logging', version:'1.1.1' + compile group: 'commons-lang', name: 'commons-lang', version:'2.5' + compile group: 'commons-collections', name: 'commons-collections', version:'2.1.1' + compile group: 'commons-fileupload', name: 'commons-fileupload', version:'1.1.1' + compile group: 'org.apache.commons', name: 'commons-email', version:'1.1' + compile group: 'commons-digester', name: 'commons-digester', version:'1.8' + compile group: 'dom4j', name: 'dom4j', version:'1.6.1' + compile group: 'dumbster', name: 'dumbster', version:'1.6' + compile group: 'ehcache', name: 'ehcache', version:'1.2.3' + compile group: 'icu4j', name: 'icu4j', version:'2.6.1' + compile group: 'javassist', name: 'javassist', version:'3.4.GA' + compile group: 'javax.xml.bind', name: 'jaxb-api', version:'2.1' + compile group: 'javax.xml', name: 'jaxb-impl', version:'2.1' + compile group: 'jaxen', name: 'jaxen', version:'1.1.1' + compile group: 'jdom', name: 'jdom', version:'1.0' + compile group: 'javax.transaction', name: 'jta', version:'1.1' + compile group: 'jstl', name: 'jstl', version:'1.2' + compile group: 'log4j', name: 'log4j', version:'1.2.14' + compile group: 'org.apache.lucene', name: 'lucene-core', version:'2.3.2' + compile group: 'org.apache.lucene', name: 'lucene-highlighter', version:'2.0.0' + compile group: 'javax.mail', name: 'mail', version:'1.4' + compile group: 'org.slf4j', name: 'slf4j-api', version:'1.5.6' + compile group: 'mysql', name: 'mysql-connector-java', version:'5.0.5' + compile group: 'org.slf4j', name: 'slf4j-log4j12', version:'1.5.6' + compile group: 'javax.persistence', name: 'persistence-api', version:'1.0' + compile group: 'quartz', name: 'quartz', version:'1.5.2' + compile group: 'javax.xml.stream', name: 'stax-api', version:'1.0-2' + compile group: 'javax.validation', name: 'validation-api', version:'1.0.0.GA' + compile group: 'xalan', name: 'xalan', version:'2.6.0' + compile group: 'xerces', name: 'xercesImpl', version:'2.6.2' + compile group: 'xml-apis', name: 'xml-apis', version:'1.3.02' + compile group: 'xerces', name: 'xmlParserAPIs', version:'2.6.2' + compile group: 'xom', name: 'xom', version:'1.0' + compile group: 'org.hibernate', name: 'hibernate-annotations', version:'3.3.1.GA' + compile group: 'org.hibernate', name: 'hibernate-entitymanager', version:'3.3.2.GA' + compile group: 'org.hibernate', name: 'hibernate-validator', version:'4.0.2.GA' + compile group: 'org.hibernate', name: 'hibernate', version:'3.2.6.ga' + compile group: 'org.hibernate.common', name: 'hibernate-commons-annotations', version:'4.0.0.Final' + compile group: 'org.hibernate', name: 'hibernate-search', version:'3.0.0.GA' + compile group: 'org.springframework', name: 'spring-webmvc', version:'3.0.1.RELEASE' + compile group: 'org.springframework', name: 'spring-context', version:'3.0.1.RELEASE' + compile group: 'org.springframework', name: 'spring-core', version:'3.0.1.RELEASE' + compile group: 'org.springframework', name: 'spring-beans', version:'3.0.1.RELEASE' + compile group: 'org.springframework', name: 'spring-aop', version:'3.0.1.RELEASE' + compile group: 'org.springframework', name: 'spring-tx', version:'3.0.1.RELEASE' + compile group: 'org.springframework', name: 'spring-orm', version:'3.0.1.RELEASE' + compile group: 'org.springframework', name: 'spring-expression', version:'3.0.1.RELEASE' + compile group: 'org.springframework', name: 'spring-asm', version:'3.0.1.RELEASE' + compile group: 'junit', name: 'junit', version:'4.4' + providedCompile group: 'javax.servlet', name: 'javax.servlet-api', version:'3.1.0' +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..d9b7505b1096bc428abaa017cb79c9d2da247111 GIT binary patch literal 55627 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 VEYIJJ9ELZ#02_W5@V{@~{68A?Eg=8^ literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..45a4d68f --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionUrl=https\://services.gradle.org/distributions/gradle-4.4.1-bin.zip +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew new file mode 100755 index 00000000..cccdd3d5 --- /dev/null +++ b/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 00000000..e95643d6 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 00000000..0ade3442 --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'Spring3HibernateApp' From c8158ab791214b2ceafebe3a17eaf4c8b58d1954 Mon Sep 17 00:00:00 2001 From: priyanshichauhan0707 Date: Wed, 26 Oct 2022 20:55:54 +0530 Subject: [PATCH 19/31] removing .gradle dir --- .gradle/4.4.1/fileChanges/last-build.bin | Bin 1 -> 0 bytes .gradle/4.4.1/fileHashes/fileHashes.bin | Bin 18697 -> 0 bytes .gradle/4.4.1/fileHashes/fileHashes.lock | Bin 17 -> 0 bytes .gradle/4.4.1/taskHistory/taskHistory.bin | Bin 19528 -> 0 bytes .gradle/4.4.1/taskHistory/taskHistory.lock | Bin 17 -> 0 bytes .../buildOutputCleanup/buildOutputCleanup.lock | Bin 17 -> 0 bytes .gradle/buildOutputCleanup/cache.properties | 2 -- .gradle/buildOutputCleanup/outputFiles.bin | Bin 18695 -> 0 bytes 8 files changed, 2 deletions(-) delete mode 100644 .gradle/4.4.1/fileChanges/last-build.bin delete mode 100644 .gradle/4.4.1/fileHashes/fileHashes.bin delete mode 100644 .gradle/4.4.1/fileHashes/fileHashes.lock delete mode 100644 .gradle/4.4.1/taskHistory/taskHistory.bin delete mode 100644 .gradle/4.4.1/taskHistory/taskHistory.lock delete mode 100644 .gradle/buildOutputCleanup/buildOutputCleanup.lock delete mode 100644 .gradle/buildOutputCleanup/cache.properties delete mode 100644 .gradle/buildOutputCleanup/outputFiles.bin diff --git a/.gradle/4.4.1/fileChanges/last-build.bin b/.gradle/4.4.1/fileChanges/last-build.bin deleted file mode 100644 index f76dd238ade08917e6712764a16a22005a50573d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1 IcmZPo000310RR91 diff --git a/.gradle/4.4.1/fileHashes/fileHashes.bin b/.gradle/4.4.1/fileHashes/fileHashes.bin deleted file mode 100644 index 1789a19093e13d4dec77c2fa4445aad3db407e16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18697 zcmeI%&ntvM9LMq5%>ixe*{78~pm;81ZR>ZOh$7n-wUTlZoXxl$SUh0DxJT^C)FNL1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5crEg zpA2`(+2&5Gb$BI(90%|j_dynBTTlu8Ib@eocl}$`DPPYr$}<0CLGakOZ+JVVZ?~DzhaIG# zEJ!p%B(Nen1X5%q1VYd)2n0KH=~B=ws9Th$Y}fY|pIuV&5b+(@-PxVl-*4tKv!{&_ zQlii23Rx_h7ptg200Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##An?BkwEGiTmz_*W zc|lOwkRhb9$gj{!d)wK9^^fjnn;YxH{|DjKf4(Q%hBE{p009U<00Izz00bZa0SG_< z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0{?AFt0r%zoZk->zeY^T*0+*6d$DbsPgndy2`3C2w6 z37$^Xgja_rm`GcSnJHl1A`X9p^ucl~23HyB=(;r9si(?HGJN zOrA$RUtW9X%Urad&`DRMjI6X_dE8KzydaHGq$3Lzk1^X7{+cAIPOA5|^}l?5uWaVW z-G}2_oWGB-WPgOK`Wt#4#+pG(*beVyQA@JIr^^}t?q+{K2Hi)Fw$#T?G{oCm8(QLx zrnJ%>V!Z diff --git a/.gradle/4.4.1/taskHistory/taskHistory.lock b/.gradle/4.4.1/taskHistory/taskHistory.lock deleted file mode 100644 index 6232ec75f8a3bf90a18c15bb88c7f345961e2347..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 TcmZS1=RVw#o+N-xcG9iEf0tg_0 z00IagfB*srAbOt{MqzOA9%$&*Ij&2~jI z`u$)(a@Tl`XT#E~+KW$xrTW0arSwznkIna;y^Grw>1pk6fti2>YXM`H)6;l#4^iuT0K>|!$GjYyx From b87ca561b40093027d286285852401d22fa21db1 Mon Sep 17 00:00:00 2001 From: neha Date: Fri, 18 Nov 2022 15:13:11 +0530 Subject: [PATCH 20/31] Adding golden-ami code of packer --- ami/golden_org/linux_hardening/playbook.yml | 6 +++ .../linux_hardening/requirements.yml | 4 ++ ami/golden_org/packer_build.json | 50 +++++++++++++++++++ ami/golden_org/variable.json | 11 ++++ 4 files changed, 71 insertions(+) create mode 100644 ami/golden_org/linux_hardening/playbook.yml create mode 100644 ami/golden_org/linux_hardening/requirements.yml create mode 100644 ami/golden_org/packer_build.json create mode 100644 ami/golden_org/variable.json diff --git a/ami/golden_org/linux_hardening/playbook.yml b/ami/golden_org/linux_hardening/playbook.yml new file mode 100644 index 00000000..831f338a --- /dev/null +++ b/ami/golden_org/linux_hardening/playbook.yml @@ -0,0 +1,6 @@ +--- +- name: os-audit + hosts: localhost + become: true + roles: + - role: osm_linux_armour \ No newline at end of file diff --git a/ami/golden_org/linux_hardening/requirements.yml b/ami/golden_org/linux_hardening/requirements.yml new file mode 100644 index 00000000..7fd7dca2 --- /dev/null +++ b/ami/golden_org/linux_hardening/requirements.yml @@ -0,0 +1,4 @@ +- name: osm_linux_armour + src: https://github.com/OT-OSM/linux_armour.git + scm: git + version: master \ No newline at end of file diff --git a/ami/golden_org/packer_build.json b/ami/golden_org/packer_build.json new file mode 100644 index 00000000..17ebfda5 --- /dev/null +++ b/ami/golden_org/packer_build.json @@ -0,0 +1,50 @@ +{ + "builders": [ + { + "type": "amazon-ebs", + "access_key": "{{user `access_key`}}", + "secret_key": "{{user `secret_key`}}", + "region": "{{user `region`}}", + "source_ami": "{{user `source_ami`}}", + "instance_type": "{{user `instance_type`}}", + "ssh_username": "{{user `ssh_username`}}", + "ami_name": "{{user `ami_name`}}-{{timestamp}}", + "vpc_id": "{{user `vpc_id`}}", + "subnet_id": "{{user `subnet_id`}}", + "security_group_id": "{{user `security_group_id`}}", + "skip_region_validation": true, + "associate_public_ip_address": true, + "tags": { + "Name": "{{user `ami_name`}}-{{timestamp}}", + "Os_hardening" : "true", + "Node-exporter" : "true", + "Environment": "global", + "Owner": "devops", + "Type": "golden" + } + } + ], + + "provisioners": [ + + { + "type": "shell", + "inline": ["sleep 30"] + }, + + + { + "type": "file", + "source": "linux_hardening", + "destination": "/tmp/linux_hardening" + }, + + { + "type": "ansible-local", + "galaxy_command": "ansible-galaxy", + "galaxy_file": "linux_hardening/requirements.yml", + "playbook_file": "linux_hardening/playbook.yml" + } + + ] + } diff --git a/ami/golden_org/variable.json b/ami/golden_org/variable.json new file mode 100644 index 00000000..8160bc02 --- /dev/null +++ b/ami/golden_org/variable.json @@ -0,0 +1,11 @@ +{ + "region": "ap-south-1", + "source_ami": "ami-024c319d5d14b463e", + "instance_type": "t2.micro", + "ssh_username": "ubuntu", + "ami_name": "golden-ami", + "vpc_id": "vpc-0928ca75a3d30c971", + "subnet_id": "subnet-086ad3db8e3652bba", + "security_group_ids": "sg-01a18e59e1b026d8f", + "ami_virtualization_type": "hvm" +} From a7bcf4535bdedce3f32b7d55ef9db786689aedbf Mon Sep 17 00:00:00 2001 From: neha Date: Fri, 18 Nov 2022 15:44:07 +0530 Subject: [PATCH 21/31] Adding golden-ami code of packer --- ami/golden_org/packer_build.json | 1 - 1 file changed, 1 deletion(-) diff --git a/ami/golden_org/packer_build.json b/ami/golden_org/packer_build.json index 17ebfda5..7830adf9 100644 --- a/ami/golden_org/packer_build.json +++ b/ami/golden_org/packer_build.json @@ -17,7 +17,6 @@ "tags": { "Name": "{{user `ami_name`}}-{{timestamp}}", "Os_hardening" : "true", - "Node-exporter" : "true", "Environment": "global", "Owner": "devops", "Type": "golden" From 68fa8498c7e0514b541aa9593d381e073e046c75 Mon Sep 17 00:00:00 2001 From: Sandeep Date: Tue, 22 Nov 2022 12:44:23 +0530 Subject: [PATCH 22/31] Added code for Elasticache setup --- terraform/elasticache/provider.tf | 3 +++ terraform/elasticache/terraform.tfvars | 3 +++ 2 files changed, 6 insertions(+) create mode 100644 terraform/elasticache/provider.tf create mode 100644 terraform/elasticache/terraform.tfvars diff --git a/terraform/elasticache/provider.tf b/terraform/elasticache/provider.tf new file mode 100644 index 00000000..0152dd66 --- /dev/null +++ b/terraform/elasticache/provider.tf @@ -0,0 +1,3 @@ +provider "aws" { + region = "us-west-2" +} \ No newline at end of file diff --git a/terraform/elasticache/terraform.tfvars b/terraform/elasticache/terraform.tfvars new file mode 100644 index 00000000..1773846e --- /dev/null +++ b/terraform/elasticache/terraform.tfvars @@ -0,0 +1,3 @@ +name = "elasticache-cluster" +security_group_ids = ["sg-02b42751eab13f53a", "sg-0a80c39996b1d8abc"] +subnet_ids = ["subnet-06e41801e9618a572", "subnet-020af10ef815e5c07"] \ No newline at end of file From dfe00302f99d6c0202ac6e747bcd84cd88a450db Mon Sep 17 00:00:00 2001 From: Surabhi Maheshwari Date: Wed, 30 Nov 2022 13:04:01 +0530 Subject: [PATCH 23/31] Added eks provider and tfvars --- terraform/eks/provider.tf | 3 +++ terraform/eks/terraform.tfvars | 17 +++++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 terraform/eks/provider.tf create mode 100644 terraform/eks/terraform.tfvars diff --git a/terraform/eks/provider.tf b/terraform/eks/provider.tf new file mode 100644 index 00000000..c28c97ad --- /dev/null +++ b/terraform/eks/provider.tf @@ -0,0 +1,3 @@ +provider "aws" { + region = "us-west-2" +} diff --git a/terraform/eks/terraform.tfvars b/terraform/eks/terraform.tfvars new file mode 100644 index 00000000..65e84a27 --- /dev/null +++ b/terraform/eks/terraform.tfvars @@ -0,0 +1,17 @@ +config_output_path = "config" +eks_cluster_version = "1.21" +endpoint_private = false +endpoint_public = true +kubeconfig_name = "config" +eks_subnets = ["subnet-06e41801e9618a572", "subnet-020af10ef815e5c07"] +ssh_key = "oregon" +node_sg = ["sg-02b42751eab13f53a", "sg-0a80c39996b1d8abc"] +instance_type = ["t2.small"] +desired_capacity = 1 +disk_size = 20 +max_capacity = 1 +min_capacity = 1 +capacity_type = "ON_DEMAND" +capacity_type_2 = "SPOT" +subnets = ["subnet-0558372d5ba749417", "subnet-08af060aeb20af40c"] +vpc_id = "vpc-04d796513538107d5" From 3a4cddcaff2bc37f94459b494833478bea60cbb1 Mon Sep 17 00:00:00 2001 From: Surabhi Maheshwari Date: Wed, 30 Nov 2022 13:56:05 +0530 Subject: [PATCH 24/31] added msk module provider and tfvars --- terraform/msk/provider.tf | 3 ++ terraform/msk/terraform.tfvars | 50 ++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 terraform/msk/provider.tf create mode 100644 terraform/msk/terraform.tfvars diff --git a/terraform/msk/provider.tf b/terraform/msk/provider.tf new file mode 100644 index 00000000..ce6d23d2 --- /dev/null +++ b/terraform/msk/provider.tf @@ -0,0 +1,3 @@ +provider "aws" { + region = "us-west-2" +} diff --git a/terraform/msk/terraform.tfvars b/terraform/msk/terraform.tfvars new file mode 100644 index 00000000..3b3f8040 --- /dev/null +++ b/terraform/msk/terraform.tfvars @@ -0,0 +1,50 @@ +## Kafka Custom KMS Key +create_kafka_kms_key_id = true +kafka_key_usage = "ENCRYPT_DECRYPT" +kafka_customer_master_key_spec = "SYMMETRIC_DEFAULT" +kafka_multi_region = false +kafka_deletion_window_in_days = null +kafka_is_enabled = true +kafka_enable_key_rotation = false +kafka_kms_key_name = "kafka-ksm-key" +## Kafka node and cluster config +name_prefix = "kafka-cluster" +vpc_id = "vpc-04d796513538107d5" +subnet_ids = ["subnet-0558372d5ba749417", "subnet-08af060aeb20af40c"] +kafka_SG_id = ["sg-02b42751eab13f53a", "sg-0a80c39996b1d8abc"] +kafka_tag_key = "user" +kafka_tag_value = "devops" +kafka_version = "2.6.2" +kafka_broker_number = 2 +kafka_instance_type = "kafka.m5.xlarge" +## Monitoring +kafka_monitoring_level = "PER_TOPIC_PER_BROKER" +enable_jmx_exporter = true +enable_node_exporter = true +## Storage +kafka_encryption_in_transit = "TLS" +kafka_ebs_volume_size = "100" +## Storage auto scaling +enable_storage_autoscaling = false +scaling_max_capacity = "200" +scaling_target_value = "60" +## Logging +enable_logging_info_cloudwatch = false +cloudwatch_log_group = null +enable_logging_info_firehouse = false +firehose_delivery_stream = null +enable_logging_info_s3 = false +s3_bucket_id = null +## Kafka Custom config file +tags = {} +kafka_custom_config_auto_create_topics = true +kafka_custom_config_delete_topics = false +kafka_custom_config_default_replication_factor = 2 +kafka_custom_config_min_insync_replicas = 1 +kafka_custom_config_num_io_threads = 8 +kafka_custom_config_num_network_threads = 5 +kafka_custom_config_num_partitions = 2 +kafka_custom_config_num_replica_fetchers = 2 +kafka_custom_config_socket_request_max_bytes = 104857600 +kafka_custom_config_unclean_leader_election_enable = true +kafka_custom_config_offsets_topic_replication_factor = 1 \ No newline at end of file From 7f2046ce70b3f88b79ab8f790706fdcd4cb301d8 Mon Sep 17 00:00:00 2001 From: Surabhi Maheshwari Date: Wed, 30 Nov 2022 13:56:28 +0530 Subject: [PATCH 25/31] added network skeleton provider and tfvars --- terraform/network_skeleton/provider.tf | 3 +++ terraform/network_skeleton/terraform.tfvars | 14 ++++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 terraform/network_skeleton/provider.tf create mode 100644 terraform/network_skeleton/terraform.tfvars diff --git a/terraform/network_skeleton/provider.tf b/terraform/network_skeleton/provider.tf new file mode 100644 index 00000000..ce6d23d2 --- /dev/null +++ b/terraform/network_skeleton/provider.tf @@ -0,0 +1,3 @@ +provider "aws" { + region = "us-west-2" +} diff --git a/terraform/network_skeleton/terraform.tfvars b/terraform/network_skeleton/terraform.tfvars new file mode 100644 index 00000000..1ade355f --- /dev/null +++ b/terraform/network_skeleton/terraform.tfvars @@ -0,0 +1,14 @@ +alb_name = "t-alb" +avaialability_zones = ["us-west-2a", "us-west-2b"] +igw_name = "t-igw" +logs_bucket = "test-b01" +logs_bucket_arn = "arn:aws:s3:::test-b01" +nat_name = "t-nat" +private_subnets_cidr = ["10.0.64.0/18", "10.0.128.0/17"] +pub_rt_name = "pub-t" +pub_subnet_name = "public-t" +public_subnets_cidr = ["10.0.0.0/19", "10.0.32.0/19"] +public_web_sg_name = "ns-web-sg01" +pvt_rt_ame = "pvt-t" +pvt_subnet_name = "private-t" +pvt_zone_name = "abc.pqr.in" \ No newline at end of file From ab39c2a9a9340d76a292651fca88f4c6d5049a76 Mon Sep 17 00:00:00 2001 From: Surabhi Maheshwari Date: Wed, 30 Nov 2022 15:38:35 +0530 Subject: [PATCH 26/31] Updated variables value --- terraform/msk/terraform.tfvars | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/terraform/msk/terraform.tfvars b/terraform/msk/terraform.tfvars index 3b3f8040..3185fcaf 100644 --- a/terraform/msk/terraform.tfvars +++ b/terraform/msk/terraform.tfvars @@ -6,7 +6,7 @@ kafka_multi_region = false kafka_deletion_window_in_days = null kafka_is_enabled = true kafka_enable_key_rotation = false -kafka_kms_key_name = "kafka-ksm-key" +kafka_kms_key_name = "msk-kafka-key" ## Kafka node and cluster config name_prefix = "kafka-cluster" vpc_id = "vpc-04d796513538107d5" From 026f6513efbc8f79020ac10f7a42985a790e6c63 Mon Sep 17 00:00:00 2001 From: Sandeep Date: Fri, 2 Dec 2022 11:59:55 +0530 Subject: [PATCH 27/31] Added capability to fetch & store state in S3 --- terraform/elasticache/_override.tf | 3 +++ terraform/elasticache/backend.tf | 7 +++++++ terraform/elasticache/data.tf | 9 +++++++++ 3 files changed, 19 insertions(+) create mode 100644 terraform/elasticache/_override.tf create mode 100644 terraform/elasticache/backend.tf create mode 100644 terraform/elasticache/data.tf diff --git a/terraform/elasticache/_override.tf b/terraform/elasticache/_override.tf new file mode 100644 index 00000000..06be56b5 --- /dev/null +++ b/terraform/elasticache/_override.tf @@ -0,0 +1,3 @@ +locals { + security_group_ids = "${data.terraform_remote_state.network.outputs.web_sg_id}" +} diff --git a/terraform/elasticache/backend.tf b/terraform/elasticache/backend.tf new file mode 100644 index 00000000..9d19eed5 --- /dev/null +++ b/terraform/elasticache/backend.tf @@ -0,0 +1,7 @@ +terraform { + backend "s3" { + bucket = "bp-step-tfstate" + key = "elasticache/terraform.tfstate" + region = "us-west-2" + } +} diff --git a/terraform/elasticache/data.tf b/terraform/elasticache/data.tf new file mode 100644 index 00000000..6ba84d9d --- /dev/null +++ b/terraform/elasticache/data.tf @@ -0,0 +1,9 @@ +data "terraform_remote_state" "network" { + backend = "s3" + + config = { + bucket = "bp-step-tfstate" + key = "network/terraform.tfstate" + region = "us-west-2" + } + From f3b3da8a9f01107166f86f3a1fc81cd1b1978656 Mon Sep 17 00:00:00 2001 From: priyanshichauhan0707 Date: Fri, 2 Dec 2022 17:52:09 +0530 Subject: [PATCH 28/31] added _override.tf, backend.tf and data.tf --- terraform/msk/_override.tf | 7 +++++++ terraform/msk/backend.tf | 7 +++++++ terraform/msk/data.tf | 9 +++++++++ 3 files changed, 23 insertions(+) create mode 100644 terraform/msk/_override.tf create mode 100644 terraform/msk/backend.tf create mode 100644 terraform/msk/data.tf diff --git a/terraform/msk/_override.tf b/terraform/msk/_override.tf new file mode 100644 index 00000000..04e6d04e --- /dev/null +++ b/terraform/msk/_override.tf @@ -0,0 +1,7 @@ +locals { + vpc_id = "${data.terraform_remote_state.network.outputs.vpc_id}" + kafka_SG_id = "${data.terraform_remote_state.network.outputs.web_sg_id}" + subnet_ids = "${data.terraform_remote_state.network.outputs.public_subnet_ids}" +} + + diff --git a/terraform/msk/backend.tf b/terraform/msk/backend.tf new file mode 100644 index 00000000..6fc56503 --- /dev/null +++ b/terraform/msk/backend.tf @@ -0,0 +1,7 @@ +terraform { + backend "s3" { + bucket = "bp-step-tfstate" + key = "msk/terraform.tfstate" + region = "us-west-2" + } +} \ No newline at end of file diff --git a/terraform/msk/data.tf b/terraform/msk/data.tf new file mode 100644 index 00000000..201213a0 --- /dev/null +++ b/terraform/msk/data.tf @@ -0,0 +1,9 @@ +data "terraform_remote_state" "network" { + backend = "s3" + + config = { + bucket = "bp-step-tfstate" + key = "network/terraform.tfstate" + region = "us-west-2" + } +} \ No newline at end of file From bc6e631baef604f1267d34f7288a45c62000fa5d Mon Sep 17 00:00:00 2001 From: priyanshichauhan0707 Date: Fri, 2 Dec 2022 18:16:18 +0530 Subject: [PATCH 29/31] renamed data_network.tf --- terraform/msk/{data.tf => data_network.tf} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename terraform/msk/{data.tf => data_network.tf} (100%) diff --git a/terraform/msk/data.tf b/terraform/msk/data_network.tf similarity index 100% rename from terraform/msk/data.tf rename to terraform/msk/data_network.tf From 82d59771f414e2ea2583b200e688d2878c98cb29 Mon Sep 17 00:00:00 2001 From: Sandeep Date: Fri, 9 Dec 2022 15:49:41 +0530 Subject: [PATCH 30/31] Updated path to correct value --- terraform/network_skeleton/terraform.tfvars | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/terraform/network_skeleton/terraform.tfvars b/terraform/network_skeleton/terraform.tfvars index 1ade355f..7a161673 100644 --- a/terraform/network_skeleton/terraform.tfvars +++ b/terraform/network_skeleton/terraform.tfvars @@ -1,8 +1,8 @@ alb_name = "t-alb" avaialability_zones = ["us-west-2a", "us-west-2b"] igw_name = "t-igw" -logs_bucket = "test-b01" -logs_bucket_arn = "arn:aws:s3:::test-b01" +logs_bucket = "bp-infra" +logs_bucket_arn = "arn:aws:s3:::bp-infra" nat_name = "t-nat" private_subnets_cidr = ["10.0.64.0/18", "10.0.128.0/17"] pub_rt_name = "pub-t" @@ -11,4 +11,4 @@ public_subnets_cidr = ["10.0.0.0/19", "10.0.32.0/19"] public_web_sg_name = "ns-web-sg01" pvt_rt_ame = "pvt-t" pvt_subnet_name = "private-t" -pvt_zone_name = "abc.pqr.in" \ No newline at end of file +pvt_zone_name = "abc.pqr.in" From c84c149c3444c3fb04009958ec84610ac559f0e0 Mon Sep 17 00:00:00 2001 From: shahid2311 Date: Wed, 29 May 2024 14:48:07 +0530 Subject: [PATCH 31/31] changes for cpu load increase and stop in controlled manner and on almost full load --- .../controller/LoadSimulationController.java | 45 ++++++++ .../sample/service/LoadSimulatorService.java | 7 ++ .../service/LoadSimulatorServiceImpl.java | 109 ++++++++++++++++++ src/main/webapp/WEB-INF/web.xml | 5 + 4 files changed, 166 insertions(+) create mode 100644 src/main/java/com/sample/controller/LoadSimulationController.java create mode 100644 src/main/java/com/sample/service/LoadSimulatorService.java create mode 100644 src/main/java/com/sample/service/LoadSimulatorServiceImpl.java diff --git a/src/main/java/com/sample/controller/LoadSimulationController.java b/src/main/java/com/sample/controller/LoadSimulationController.java new file mode 100644 index 00000000..dc773c2c --- /dev/null +++ b/src/main/java/com/sample/controller/LoadSimulationController.java @@ -0,0 +1,45 @@ +package com.sample.controller; + +import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import com.sample.service.LoadSimulatorService; + + + + +@Controller +public class LoadSimulationController { + + @Autowired + private LoadSimulatorService loadSimulatorService; + + @RequestMapping(value="/controlled/startCpuLoad", method = RequestMethod.GET) + @ResponseBody + public String increaseCpuLoadControlled(@RequestParam int percentage, @RequestParam int duration, @RequestParam int threadCount) { + System.out.println("increaseCpuLoad method called."); + return loadSimulatorService.increaseCpuLoad(percentage, duration, threadCount, true); + } + + @RequestMapping(value="/uncontrolled/startCpuLoad", method = RequestMethod.GET) + @ResponseBody + public String increaseCpuLoadUncontrolled(@RequestParam int duration, @RequestParam int threadCount) { + System.out.println("increaseCpuLoad method called."); + return loadSimulatorService.increaseCpuLoad(0, duration, threadCount, false); + } + + + @RequestMapping(value="/stopCpuLoad", method = RequestMethod.GET) + @ResponseBody + public String stopCpuLoad() { + System.out.println("stopCpuLoad method called."); + String response = loadSimulatorService.stopCpuLoad(); + return response; + } + +} diff --git a/src/main/java/com/sample/service/LoadSimulatorService.java b/src/main/java/com/sample/service/LoadSimulatorService.java new file mode 100644 index 00000000..a4004d54 --- /dev/null +++ b/src/main/java/com/sample/service/LoadSimulatorService.java @@ -0,0 +1,7 @@ +package com.sample.service; + +public interface LoadSimulatorService { + + public String increaseCpuLoad(int percentage, int duration , int threads, boolean isControlled); + public String stopCpuLoad(); +} diff --git a/src/main/java/com/sample/service/LoadSimulatorServiceImpl.java b/src/main/java/com/sample/service/LoadSimulatorServiceImpl.java new file mode 100644 index 00000000..7184e5bb --- /dev/null +++ b/src/main/java/com/sample/service/LoadSimulatorServiceImpl.java @@ -0,0 +1,109 @@ +package com.sample.service; + +import org.springframework.stereotype.Service; + +@Service("LoadSimulatorService") +public class LoadSimulatorServiceImpl implements LoadSimulatorService { + + private volatile boolean cpuLoadEnabled = false; + private static final int NUM_CORES = Runtime.getRuntime().availableProcessors(); + private volatile int count = 0; + + @Override + public String increaseCpuLoad(int percentage, int duration, int threadCount, boolean control) { + + System.out.println("ServiceImpl increaseCpuLoad called"); + cpuLoadEnabled = true; + if (percentage < 0 || percentage > 100) { + return "Percentage must be between 0 and 100"; + } + if (duration <= 0) { + return "Duration must be greater than 0"; + } + final int loadPercentage = percentage; + final int loadDuration = duration; + + + // Calculate the maximum number of threads based on available memory + long maxMemory = Runtime.getRuntime().maxMemory(); + long usedMemory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); + long availableMemory = maxMemory - usedMemory; + + // Approximate memory usage per thread (this is a rough estimate) + long memoryPerThread = 1 * 1024 * 1024; // 1 MB per thread + int maxThreadsBasedOnMemory = (int) (availableMemory / memoryPerThread); + + // Calculate the final number of threads to use + int numThreads = Math.min(threadCount, maxThreadsBasedOnMemory); + numThreads = Math.max(numThreads, 1); // Ensure at least one thread is used + + System.out.println("Number of cores: " + NUM_CORES + ", Requested threads: " + threadCount + + ", Adjusted threads: " + numThreads + ", Max threads based on memory: " + maxThreadsBasedOnMemory); + final boolean isControlled = control; + for (int i = 0; i < numThreads; i++) { + new Thread(new Runnable() { + public void run() { + try { + System.out.println("Thread ID: " + Thread.currentThread().getId()); + if(isControlled) { + generateControlledCpuLoad(loadPercentage, loadDuration); + }else { + generateUncontrolledCpuLoad(loadDuration); + } + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + }).start(); + } + if(!isControlled) { + return "CPU load increased for "+ duration + " seconds"; + }else { + return "CPU load increased by " + percentage + "% for " + duration + " seconds"; + } + + } + + @Override + public String stopCpuLoad() { + System.out.println("ServiceImpl stopCpuLoad called"); + cpuLoadEnabled = false; + count = 0; + return "CPU load stopped."; + } + + private void generateUncontrolledCpuLoad(int duration) throws InterruptedException { + + long endTime = System.currentTimeMillis() + duration * 1000L; + + while (System.currentTimeMillis() < endTime && cpuLoadEnabled) { + count++; + if (!cpuLoadEnabled) { + System.out.println("Cpu load disabled/stop is called"); + return; // Exit if CPU load is disabled + } + } + } + + private void generateControlledCpuLoad(int percentage, int duration) throws InterruptedException { + long endTime = System.currentTimeMillis() + duration * 1000L; + long busyTime = (long) (10 * percentage); // Busy time in milliseconds + long idleTime = 10 - busyTime; // Idle time in milliseconds + + while (System.currentTimeMillis() < endTime && cpuLoadEnabled) { + long startTime = System.currentTimeMillis(); + + // Busy loop for the calculated busy time + while ((System.currentTimeMillis() - startTime) < busyTime) { + count ++; + System.out.println("Cpu is busy"); + } + + // Sleep for the calculated idle time + if (idleTime > 0) { + + Thread.sleep(idleTime); + } + } + } +} \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 407170e1..052dd7e3 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -45,6 +45,11 @@ sdnext *.html + + + sdnext + / + index.html