Compare commits
325 Commits
dependabot
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a672db346c | ||
|
|
27b63f4305 | ||
|
|
b18444293b | ||
|
|
5a9dd70280 | ||
|
|
bd257c811d | ||
|
|
8a76f45358 | ||
|
|
14b95378d1 | ||
|
|
6d8d03a64e | ||
|
|
1f5bea6af9 | ||
|
|
1ed363389f | ||
|
|
5fc64d1662 | ||
|
|
179201f367 | ||
|
|
41ba0f8600 | ||
|
|
7758c342bc | ||
|
|
8f2452bc69 | ||
|
|
df54ae491f | ||
|
|
f2e38be788 | ||
|
|
ec0cca1c8b | ||
|
|
f3f3e622e2 | ||
|
|
cd69fa5842 | ||
|
|
3930e1cb03 | ||
|
|
cd3e68cc66 | ||
|
|
06af47eb4b | ||
|
|
f96a02270e | ||
|
|
093221423e | ||
|
|
d61382d459 | ||
|
|
995a80b24b | ||
|
|
52ce0d921f | ||
|
|
126fa44d97 | ||
|
|
b070b3376b | ||
|
|
a66b6a0aaa | ||
|
|
3d2be288e5 | ||
|
|
937fee0773 | ||
|
|
f531c21c67 | ||
|
|
80165c55ab | ||
|
|
e4f9bece6b | ||
|
|
7f1cab6e0a | ||
|
|
351804a083 | ||
|
|
657539d435 | ||
|
|
f3064e5fa0 | ||
|
|
c6127955bd | ||
|
|
2185f9c68d | ||
|
|
bd8c084a88 | ||
|
|
1d9c841d88 | ||
|
|
ce10f21788 | ||
|
|
8a7948a1b3 | ||
|
|
0372c85220 | ||
|
|
862b40b1fb | ||
|
|
a5455521df | ||
|
|
89bd3b6729 | ||
|
|
e2a0494de4 | ||
|
|
a9bd712afe | ||
|
|
e1dae42a19 | ||
|
|
041442297e | ||
|
|
2223be80c9 | ||
|
|
1f37a81b90 | ||
|
|
c2145b5ece | ||
|
|
c9c34a1d36 | ||
|
|
3a95c4bd5e | ||
|
|
b359ee9124 | ||
|
|
00acacedce | ||
|
|
66b8191e10 | ||
|
|
6f0c708d2f | ||
|
|
385c8f7e96 | ||
|
|
b2ab616af8 | ||
|
|
02c73d52f3 | ||
|
|
c593aae6e1 | ||
|
|
50f24940fd | ||
|
|
a937ad3f96 | ||
|
|
107586e6e5 | ||
|
|
7b3d79713c | ||
|
|
00187368cb | ||
|
|
766bf4eda2 | ||
|
|
843bfe6ad9 | ||
|
|
de2d608c1d | ||
|
|
0d7b195e78 | ||
|
|
0de908ee78 | ||
|
|
8f09911a99 | ||
|
|
972916ac7d | ||
|
|
479a3cdb5b | ||
|
|
6b921c192d | ||
|
|
2b1c0df8cf | ||
|
|
2b97cc155f | ||
|
|
72cca1debc | ||
|
|
6d122d285b | ||
|
|
9d6f34dd98 | ||
|
|
aa952c0b18 | ||
|
|
98b3c96274 | ||
|
|
bbb40758ff | ||
|
|
6a049565f6 | ||
|
|
0abe046a26 | ||
|
|
c78b0ab529 | ||
|
|
799cc2f634 | ||
|
|
35514b4d94 | ||
|
|
759c7b466a | ||
|
|
940ae82360 | ||
|
|
f3a5981709 | ||
|
|
aa6af18246 | ||
|
|
ef2c034fcc | ||
|
|
4951f762e8 | ||
|
|
90b859c289 | ||
|
|
d60dc3028d | ||
|
|
3c85af86a9 | ||
|
|
69a73d24cb | ||
|
|
5d8237ff55 | ||
|
|
60275444ea | ||
|
|
9976bb40a7 | ||
|
|
4f7a266d5b | ||
|
|
5f16d8b6e4 | ||
|
|
e6fcc497ba | ||
|
|
4196890615 | ||
|
|
e152f99426 | ||
|
|
31c5e50424 | ||
|
|
b0ed76a17c | ||
|
|
451e92ee5e | ||
|
|
557ec88beb | ||
|
|
61b77ecb4b | ||
|
|
31e9f97524 | ||
|
|
0b6178700e | ||
|
|
dac475644c | ||
|
|
c3ed0bbc04 | ||
|
|
647db78e01 | ||
|
|
f935b37177 | ||
|
|
c21407a4c9 | ||
|
|
876a79c856 | ||
|
|
eadd7c34a5 | ||
|
|
6aa921d29b | ||
|
|
149ceab800 | ||
|
|
c941e1786f | ||
|
|
b292d2b21d | ||
|
|
8b3fc268e7 | ||
|
|
7b1f3dd12f | ||
|
|
d987fde764 | ||
|
|
889c55e957 | ||
|
|
ce4ad5edb7 | ||
|
|
2283feeab8 | ||
|
|
7a154df18d | ||
|
|
d2fcd379ad | ||
|
|
e58eb0649f | ||
|
|
5c5371b500 | ||
|
|
903b344330 | ||
|
|
2ae82f9ecf | ||
|
|
7b98771339 | ||
|
|
908f53777d | ||
|
|
26a4ef6eb9 | ||
|
|
37950f1a66 | ||
|
|
c7937587fc | ||
|
|
f46c7c7fa3 | ||
|
|
e4d52aa182 | ||
|
|
7520c38d3e | ||
|
|
956f5a6570 | ||
|
|
0ce5c7579e | ||
|
|
d715f36b80 | ||
|
|
e07f8b527f | ||
|
|
1d11258019 | ||
|
|
bba0174e0e | ||
|
|
831b845398 | ||
|
|
58273afb72 | ||
|
|
3cf348e2d8 | ||
|
|
cf86383325 | ||
|
|
bca7b37771 | ||
|
|
3ffab95e8c | ||
|
|
a09f5e7aa0 | ||
|
|
b72173ad27 | ||
|
|
aac07331e8 | ||
|
|
45590a81c2 | ||
|
|
1e39c49cca | ||
|
|
c8bd0660f5 | ||
|
|
2874daed69 | ||
|
|
35a820acbb | ||
|
|
83e5e1048e | ||
|
|
28147ad44c | ||
|
|
154453808d | ||
|
|
b7139e9073 | ||
|
|
64499f5582 | ||
|
|
c870f5dd4c | ||
|
|
946a9de553 | ||
|
|
bf004661b0 | ||
|
|
9cb21ffb8a | ||
|
|
375928575c | ||
|
|
36a5bdda1e | ||
|
|
d0b88ace16 | ||
|
|
2e74db8684 | ||
|
|
597844a483 | ||
|
|
3c934fd394 | ||
|
|
c66d4bd7d7 | ||
|
|
5deb6fb09c | ||
|
|
55dfc429cb | ||
|
|
5a9e2751db | ||
|
|
9e6f17cf1e | ||
|
|
e7c95ea2e4 | ||
|
|
16815980a9 | ||
|
|
d49982299d | ||
|
|
cf7ecd5f4f | ||
|
|
406a57d203 | ||
|
|
a0c58111ec | ||
|
|
355ceb2517 | ||
|
|
c4d2d74f70 | ||
|
|
058bf95ed6 | ||
|
|
adf0b55548 | ||
|
|
7b76a8a562 | ||
|
|
f6501aff2c | ||
|
|
0101fc58f0 | ||
|
|
36e25d3b7e | ||
|
|
c36ad11f17 | ||
|
|
a19a7faf43 | ||
|
|
9f8e3f3bd5 | ||
|
|
6784d3c31f | ||
|
|
8a253fe371 | ||
|
|
03517e3037 | ||
|
|
ec71062edb | ||
|
|
8d82de705f | ||
|
|
84f58908ed | ||
|
|
6042b5c086 | ||
|
|
0eaea89433 | ||
|
|
cca9825c1c | ||
|
|
59747d5a60 | ||
|
|
3883b0b337 | ||
|
|
c41d61f17a | ||
|
|
f9bde4b1e2 | ||
|
|
5168068e7f | ||
|
|
d2acf47492 | ||
|
|
b8358fc949 | ||
|
|
52c92afd68 | ||
|
|
bb4cd9e297 | ||
|
|
0a37bcbba9 | ||
|
|
64c61b74e4 | ||
|
|
58cd6f04dd | ||
|
|
78610bb86b | ||
|
|
cb69d89ca5 | ||
|
|
88f18e1d3d | ||
|
|
10e8867d4b | ||
|
|
d66a38943f | ||
|
|
18a6de19d4 | ||
|
|
b2c67f3d10 | ||
|
|
a359a8d3f2 | ||
|
|
273111b0c6 | ||
|
|
46fe09352e | ||
|
|
ab79a6be97 | ||
|
|
c4a70d8865 | ||
|
|
bcd975e02f | ||
|
|
7fd1bdc29f | ||
|
|
4b69588894 | ||
|
|
88936def38 | ||
|
|
caf96dd931 | ||
|
|
6b13e04aea | ||
|
|
a9795c3298 | ||
|
|
ecb2634a77 | ||
|
|
237a5a6441 | ||
|
|
674d4feb17 | ||
|
|
610906f891 | ||
|
|
258f7fb137 | ||
|
|
475ef47881 | ||
|
|
39c28dddf0 | ||
|
|
2b8664e49e | ||
|
|
d0c5706133 | ||
|
|
cd45701470 | ||
|
|
070ad968e6 | ||
|
|
c29993b416 | ||
|
|
a481a48992 | ||
|
|
3be0e85a77 | ||
|
|
973cb7a081 | ||
|
|
33dacb36de | ||
|
|
aaa07d4c70 | ||
|
|
23cd4e4da7 | ||
|
|
43b9c83917 | ||
|
|
b558643405 | ||
|
|
acdf98e71b | ||
|
|
c30b27b240 | ||
|
|
dbdd4d20cb | ||
|
|
379f0d6799 | ||
|
|
8e299cf819 | ||
|
|
14536868c5 | ||
|
|
bbca460ed2 | ||
|
|
cd2e56a959 | ||
|
|
143a5b53d0 | ||
|
|
fec088b7db | ||
|
|
d68609b407 | ||
|
|
8b1ae3f3ed | ||
|
|
0ccd671636 | ||
|
|
1dac3ad175 | ||
|
|
91e38a8361 | ||
|
|
071651aa67 | ||
|
|
a6c5ab4cd7 | ||
|
|
c28b2d4a73 | ||
|
|
8bca7692e2 | ||
|
|
d1b5b19dd6 | ||
|
|
d5ff8dae58 | ||
|
|
4bb5bb8af9 | ||
|
|
e03595d5bd | ||
|
|
b5cfe4ad2a | ||
|
|
4a64888977 | ||
|
|
44d082c163 | ||
|
|
8b3fc4cf5c | ||
|
|
5bd780f9c8 | ||
|
|
eba824b908 | ||
|
|
8de5f6d41c | ||
|
|
381be70991 | ||
|
|
87a6cac6b3 | ||
|
|
fef6c48fe1 | ||
|
|
3f59bd2ea4 | ||
|
|
e2d6cc3acb | ||
|
|
fef53fa72a | ||
|
|
6b2ad23059 | ||
|
|
368a059cfe | ||
|
|
67b4cbe08f | ||
|
|
0514f9f517 | ||
|
|
76bcc6c016 | ||
|
|
fd14c4c13e | ||
|
|
39dbdc129f | ||
|
|
dbaa38a5fe | ||
|
|
8f6e222ef2 | ||
|
|
88c5ff3dc7 | ||
|
|
4cf2cbc10c | ||
|
|
e4e3d8a55b | ||
|
|
d41fa4a006 | ||
|
|
48cdce6e65 | ||
|
|
2d8c099993 | ||
|
|
1c92604f3b | ||
|
|
6a63059b8c | ||
|
|
1de287bcdb | ||
|
|
f044fcc228 | ||
|
|
ee1712c245 | ||
|
|
8f03b89816 | ||
|
|
f751203867 |
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
@@ -17,7 +17,7 @@ jobs:
|
||||
matrix:
|
||||
# The MODULE environment variable is evaluated in build-all.sh to run a subset
|
||||
# of the builds. This way, multiple modules can be built in parallel.
|
||||
module: [ "module1", "module2", "module3", "module4", "module5" ]
|
||||
module: [ "module1", "module2", "module3", "module4", "module5", "module6", "module7" ]
|
||||
|
||||
steps:
|
||||
|
||||
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1,3 +1,5 @@
|
||||
**/.idea/
|
||||
**/*.iml
|
||||
**/.DS_Store
|
||||
**/.terraform
|
||||
|
||||
|
||||
11
aws/aws-terraform/README.md
Normal file
11
aws/aws-terraform/README.md
Normal file
@@ -0,0 +1,11 @@
|
||||
# Terraform for creating AWS Resources
|
||||
|
||||
Example code to create/update AWS resources with Terraform.
|
||||
Examples include Terraform capabilities of using modules, input variables and using Terraform cloud.
|
||||
|
||||
## Blog posts
|
||||
|
||||
Blog posts about this topic:
|
||||
|
||||
* [Using Terraform to create AWS resources](https://reflectoring.io/terraform-aws/)
|
||||
|
||||
41
aws/aws-terraform/aws-app-stack-cloud/main.tf
Normal file
41
aws/aws-terraform/aws-app-stack-cloud/main.tf
Normal file
@@ -0,0 +1,41 @@
|
||||
terraform {
|
||||
|
||||
backend "remote" {
|
||||
hostname = "app.terraform.io"
|
||||
organization = "pratikorg"
|
||||
token = "pj7p59JFwSC4jQ.atlasv1.qfmTxLjTfaM5zKyaQrcGzuTojv6oCyLIoIAO7DkA2ieQY7OyINjINGGMiTczt62p1bs"
|
||||
workspaces {
|
||||
name = "my-tf-workspace"
|
||||
}
|
||||
}
|
||||
required_providers {
|
||||
aws = {
|
||||
source = "hashicorp/aws"
|
||||
version = "~> 3.36"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
provider "aws" {
|
||||
profile = "default"
|
||||
region = "us-west-2"
|
||||
}
|
||||
|
||||
module "app_server" {
|
||||
source = "./modules/application"
|
||||
|
||||
ec2_instance_type = "t2.micro"
|
||||
ami = "ami-830c94e3"
|
||||
tags = {
|
||||
Name = "server for web"
|
||||
Env = "dev"
|
||||
}
|
||||
}
|
||||
|
||||
module "app_storage" {
|
||||
source = "./modules/storage/"
|
||||
|
||||
bucket_name = "io.pratik.tf-example-bucket"
|
||||
env = "dev"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
resource "aws_instance" "vm-web" {
|
||||
ami = var.ami
|
||||
instance_type = var.ec2_instance_type
|
||||
tags = var.tags
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
output "instanceID" {
|
||||
description = "ID of ec2 instance"
|
||||
value = aws_instance.vm-web.id
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
variable "ec2_instance_type" {
|
||||
description = "Instance type"
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "ami" {
|
||||
description = "ami id"
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "tags" {
|
||||
description = "Tags to set on the bucket."
|
||||
type = map(string)
|
||||
default = {Name = "server for web"
|
||||
Env = "dev"}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
resource "aws_s3_bucket" "s3_bucket" {
|
||||
bucket = format("%s-%s",var.bucket_name,var.env)
|
||||
acl = "private"
|
||||
|
||||
tags = {
|
||||
Name = var.bucket_name
|
||||
Environment = var.env
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
output "arn" {
|
||||
description = "ARN of the bucket"
|
||||
value = aws_s3_bucket.s3_bucket.arn
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
# Input variable definitions
|
||||
|
||||
variable "bucket_name" {
|
||||
description = "Name of bucket"
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "env" {
|
||||
description = "Environment like dev, prod"
|
||||
type = string
|
||||
}
|
||||
|
||||
|
||||
24
aws/aws-terraform/aws-app-stack-input-vars/main.tf
Normal file
24
aws/aws-terraform/aws-app-stack-input-vars/main.tf
Normal file
@@ -0,0 +1,24 @@
|
||||
terraform {
|
||||
required_providers {
|
||||
aws = {
|
||||
source = "hashicorp/aws"
|
||||
version = "~> 3.27"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
provider "aws" {
|
||||
profile = "default"
|
||||
region = "us-west-2"
|
||||
}
|
||||
|
||||
resource "aws_instance" "vm-web" {
|
||||
ami = "ami-830c94e3"
|
||||
instance_type = var.ec2_instance_type
|
||||
|
||||
tags = {
|
||||
Name = "server for web"
|
||||
Env = "dev"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
ec2_instance_type = "t2.micro"
|
||||
4
aws/aws-terraform/aws-app-stack-input-vars/variables.tf
Normal file
4
aws/aws-terraform/aws-app-stack-input-vars/variables.tf
Normal file
@@ -0,0 +1,4 @@
|
||||
variable "ec2_instance_type" {
|
||||
description = "AWS EC2 instance type."
|
||||
type = string
|
||||
}
|
||||
33
aws/aws-terraform/aws-app-stack-modules/main.tf
Normal file
33
aws/aws-terraform/aws-app-stack-modules/main.tf
Normal file
@@ -0,0 +1,33 @@
|
||||
terraform {
|
||||
|
||||
required_providers {
|
||||
aws = {
|
||||
source = "hashicorp/aws"
|
||||
version = "~> 3.36"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
provider "aws" {
|
||||
profile = "default"
|
||||
region = "us-west-2"
|
||||
}
|
||||
|
||||
module "app_server" {
|
||||
source = "./modules/application"
|
||||
|
||||
ec2_instance_type = "t2.micro"
|
||||
ami = "ami-830c94e3"
|
||||
tags = {
|
||||
Name = "server for web"
|
||||
Env = "dev"
|
||||
}
|
||||
}
|
||||
|
||||
module "app_storage" {
|
||||
source = "./modules/storage/"
|
||||
|
||||
bucket_name = "io.pratik.tf-example-bucket"
|
||||
env = "dev"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
resource "aws_instance" "vm-web" {
|
||||
ami = var.ami
|
||||
instance_type = var.ec2_instance_type
|
||||
tags = var.tags
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
output "instanceID" {
|
||||
description = "ID of ec2 instance"
|
||||
value = aws_instance.vm-web.id
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
variable "ec2_instance_type" {
|
||||
description = "Instance type"
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "ami" {
|
||||
description = "ami id"
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "tags" {
|
||||
description = "Tags to set on the bucket."
|
||||
type = map(string)
|
||||
default = {Name = "server for web"
|
||||
Env = "dev"}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
resource "aws_s3_bucket" "s3_bucket" {
|
||||
bucket = format("%s-%s",var.bucket_name,var.env)
|
||||
acl = "private"
|
||||
|
||||
tags = {
|
||||
Name = var.bucket_name
|
||||
Environment = var.env
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
output "arn" {
|
||||
description = "ARN of the bucket"
|
||||
value = aws_s3_bucket.s3_bucket.arn
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
# Input variable definitions
|
||||
|
||||
variable "bucket_name" {
|
||||
description = "Name of bucket"
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "env" {
|
||||
description = "Environment like dev, prod"
|
||||
type = string
|
||||
}
|
||||
|
||||
|
||||
24
aws/aws-terraform/aws-app-stack/main.tf
Normal file
24
aws/aws-terraform/aws-app-stack/main.tf
Normal file
@@ -0,0 +1,24 @@
|
||||
terraform {
|
||||
required_providers {
|
||||
aws = {
|
||||
source = "hashicorp/aws"
|
||||
version = "~> 3.27"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
provider "aws" {
|
||||
profile = "default"
|
||||
region = "us-west-2"
|
||||
}
|
||||
|
||||
resource "aws_instance" "vm-web" {
|
||||
ami = "ami-830c94e3"
|
||||
instance_type = "t2.micro"
|
||||
|
||||
tags = {
|
||||
Name = "server for web"
|
||||
Env = "dev"
|
||||
}
|
||||
}
|
||||
|
||||
117
aws/cdk/.mvn/wrapper/MavenWrapperDownloader.java
vendored
Normal file
117
aws/cdk/.mvn/wrapper/MavenWrapperDownloader.java
vendored
Normal file
@@ -0,0 +1,117 @@
|
||||
/*
|
||||
* Copyright 2007-present the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
import java.net.*;
|
||||
import java.io.*;
|
||||
import java.nio.channels.*;
|
||||
import java.util.Properties;
|
||||
|
||||
public class MavenWrapperDownloader {
|
||||
|
||||
private static final String WRAPPER_VERSION = "0.5.6";
|
||||
/**
|
||||
* Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
|
||||
*/
|
||||
private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
|
||||
+ WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
|
||||
|
||||
/**
|
||||
* Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
|
||||
* use instead of the default one.
|
||||
*/
|
||||
private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
|
||||
".mvn/wrapper/maven-wrapper.properties";
|
||||
|
||||
/**
|
||||
* Path where the maven-wrapper.jar will be saved to.
|
||||
*/
|
||||
private static final String MAVEN_WRAPPER_JAR_PATH =
|
||||
".mvn/wrapper/maven-wrapper.jar";
|
||||
|
||||
/**
|
||||
* Name of the property which should be used to override the default download url for the wrapper.
|
||||
*/
|
||||
private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
|
||||
|
||||
public static void main(String args[]) {
|
||||
System.out.println("- Downloader started");
|
||||
File baseDirectory = new File(args[0]);
|
||||
System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
|
||||
|
||||
// If the maven-wrapper.properties exists, read it and check if it contains a custom
|
||||
// wrapperUrl parameter.
|
||||
File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
|
||||
String url = DEFAULT_DOWNLOAD_URL;
|
||||
if(mavenWrapperPropertyFile.exists()) {
|
||||
FileInputStream mavenWrapperPropertyFileInputStream = null;
|
||||
try {
|
||||
mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
|
||||
Properties mavenWrapperProperties = new Properties();
|
||||
mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
|
||||
url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
|
||||
} catch (IOException e) {
|
||||
System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
|
||||
} finally {
|
||||
try {
|
||||
if(mavenWrapperPropertyFileInputStream != null) {
|
||||
mavenWrapperPropertyFileInputStream.close();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
// Ignore ...
|
||||
}
|
||||
}
|
||||
}
|
||||
System.out.println("- Downloading from: " + url);
|
||||
|
||||
File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
|
||||
if(!outputFile.getParentFile().exists()) {
|
||||
if(!outputFile.getParentFile().mkdirs()) {
|
||||
System.out.println(
|
||||
"- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
|
||||
}
|
||||
}
|
||||
System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
|
||||
try {
|
||||
downloadFileFromURL(url, outputFile);
|
||||
System.out.println("Done");
|
||||
System.exit(0);
|
||||
} catch (Throwable e) {
|
||||
System.out.println("- Error downloading");
|
||||
e.printStackTrace();
|
||||
System.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
private static void downloadFileFromURL(String urlString, File destination) throws Exception {
|
||||
if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
|
||||
String username = System.getenv("MVNW_USERNAME");
|
||||
char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
|
||||
Authenticator.setDefault(new Authenticator() {
|
||||
@Override
|
||||
protected PasswordAuthentication getPasswordAuthentication() {
|
||||
return new PasswordAuthentication(username, password);
|
||||
}
|
||||
});
|
||||
}
|
||||
URL website = new URL(urlString);
|
||||
ReadableByteChannel rbc;
|
||||
rbc = Channels.newChannel(website.openStream());
|
||||
FileOutputStream fos = new FileOutputStream(destination);
|
||||
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
|
||||
fos.close();
|
||||
rbc.close();
|
||||
}
|
||||
|
||||
}
|
||||
BIN
aws/cdk/.mvn/wrapper/maven-wrapper.jar
vendored
Normal file
BIN
aws/cdk/.mvn/wrapper/maven-wrapper.jar
vendored
Normal file
Binary file not shown.
2
aws/cdk/.mvn/wrapper/maven-wrapper.properties
vendored
Normal file
2
aws/cdk/.mvn/wrapper/maven-wrapper.properties
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip
|
||||
wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar
|
||||
182
aws/cdk/mvnw.cmd
vendored
Normal file
182
aws/cdk/mvnw.cmd
vendored
Normal file
@@ -0,0 +1,182 @@
|
||||
@REM ----------------------------------------------------------------------------
|
||||
@REM Licensed to the Apache Software Foundation (ASF) under one
|
||||
@REM or more contributor license agreements. See the NOTICE file
|
||||
@REM distributed with this work for additional information
|
||||
@REM regarding copyright ownership. The ASF licenses this file
|
||||
@REM to you under the Apache License, Version 2.0 (the
|
||||
@REM "License"); you may not use this file except in compliance
|
||||
@REM with the License. You may obtain a copy of the License at
|
||||
@REM
|
||||
@REM http://www.apache.org/licenses/LICENSE-2.0
|
||||
@REM
|
||||
@REM Unless required by applicable law or agreed to in writing,
|
||||
@REM software distributed under the License is distributed on an
|
||||
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
@REM KIND, either express or implied. See the License for the
|
||||
@REM specific language governing permissions and limitations
|
||||
@REM under the License.
|
||||
@REM ----------------------------------------------------------------------------
|
||||
|
||||
@REM ----------------------------------------------------------------------------
|
||||
@REM Maven Start Up Batch script
|
||||
@REM
|
||||
@REM Required ENV vars:
|
||||
@REM JAVA_HOME - location of a JDK home dir
|
||||
@REM
|
||||
@REM Optional ENV vars
|
||||
@REM M2_HOME - location of maven2's installed home dir
|
||||
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
|
||||
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
|
||||
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
|
||||
@REM e.g. to debug Maven itself, use
|
||||
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
|
||||
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
|
||||
@REM ----------------------------------------------------------------------------
|
||||
|
||||
@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
|
||||
@echo off
|
||||
@REM set title of command window
|
||||
title %0
|
||||
@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
|
||||
@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
|
||||
|
||||
@REM set %HOME% to equivalent of $HOME
|
||||
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
|
||||
|
||||
@REM Execute a user defined script before this one
|
||||
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
|
||||
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
|
||||
if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
|
||||
if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
|
||||
:skipRcPre
|
||||
|
||||
@setlocal
|
||||
|
||||
set ERROR_CODE=0
|
||||
|
||||
@REM To isolate internal variables from possible post scripts, we use another setlocal
|
||||
@setlocal
|
||||
|
||||
@REM ==== START VALIDATION ====
|
||||
if not "%JAVA_HOME%" == "" goto OkJHome
|
||||
|
||||
echo.
|
||||
echo Error: JAVA_HOME not found in your environment. >&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the >&2
|
||||
echo location of your Java installation. >&2
|
||||
echo.
|
||||
goto error
|
||||
|
||||
:OkJHome
|
||||
if exist "%JAVA_HOME%\bin\java.exe" goto init
|
||||
|
||||
echo.
|
||||
echo Error: JAVA_HOME is set to an invalid directory. >&2
|
||||
echo JAVA_HOME = "%JAVA_HOME%" >&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the >&2
|
||||
echo location of your Java installation. >&2
|
||||
echo.
|
||||
goto error
|
||||
|
||||
@REM ==== END VALIDATION ====
|
||||
|
||||
:init
|
||||
|
||||
@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
|
||||
@REM Fallback to current working directory if not found.
|
||||
|
||||
set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
|
||||
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
|
||||
|
||||
set EXEC_DIR=%CD%
|
||||
set WDIR=%EXEC_DIR%
|
||||
:findBaseDir
|
||||
IF EXIST "%WDIR%"\.mvn goto baseDirFound
|
||||
cd ..
|
||||
IF "%WDIR%"=="%CD%" goto baseDirNotFound
|
||||
set WDIR=%CD%
|
||||
goto findBaseDir
|
||||
|
||||
:baseDirFound
|
||||
set MAVEN_PROJECTBASEDIR=%WDIR%
|
||||
cd "%EXEC_DIR%"
|
||||
goto endDetectBaseDir
|
||||
|
||||
:baseDirNotFound
|
||||
set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
|
||||
cd "%EXEC_DIR%"
|
||||
|
||||
:endDetectBaseDir
|
||||
|
||||
IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
|
||||
|
||||
@setlocal EnableExtensions EnableDelayedExpansion
|
||||
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
|
||||
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
|
||||
|
||||
:endReadAdditionalConfig
|
||||
|
||||
SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
|
||||
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
|
||||
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
|
||||
|
||||
set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
|
||||
|
||||
FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
|
||||
IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
|
||||
)
|
||||
|
||||
@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
|
||||
@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
|
||||
if exist %WRAPPER_JAR% (
|
||||
if "%MVNW_VERBOSE%" == "true" (
|
||||
echo Found %WRAPPER_JAR%
|
||||
)
|
||||
) else (
|
||||
if not "%MVNW_REPOURL%" == "" (
|
||||
SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
|
||||
)
|
||||
if "%MVNW_VERBOSE%" == "true" (
|
||||
echo Couldn't find %WRAPPER_JAR%, downloading it ...
|
||||
echo Downloading from: %DOWNLOAD_URL%
|
||||
)
|
||||
|
||||
powershell -Command "&{"^
|
||||
"$webclient = new-object System.Net.WebClient;"^
|
||||
"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
|
||||
"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
|
||||
"}"^
|
||||
"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
|
||||
"}"
|
||||
if "%MVNW_VERBOSE%" == "true" (
|
||||
echo Finished downloading %WRAPPER_JAR%
|
||||
)
|
||||
)
|
||||
@REM End of extension
|
||||
|
||||
@REM Provide a "standardized" way to retrieve the CLI args that will
|
||||
@REM work with both Windows and non-Windows executions.
|
||||
set MAVEN_CMD_LINE_ARGS=%*
|
||||
|
||||
%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
|
||||
if ERRORLEVEL 1 goto error
|
||||
goto end
|
||||
|
||||
:error
|
||||
set ERROR_CODE=1
|
||||
|
||||
:end
|
||||
@endlocal & set ERROR_CODE=%ERROR_CODE%
|
||||
|
||||
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
|
||||
@REM check for post script, once with legacy .bat ending and once with .cmd ending
|
||||
if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
|
||||
if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
|
||||
:skipRcPost
|
||||
|
||||
@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
|
||||
if "%MAVEN_BATCH_PAUSE%" == "on" pause
|
||||
|
||||
if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
|
||||
|
||||
exit /B %ERROR_CODE%
|
||||
23
aws/cdk/src/main/java/com/myorg/SecondStack.java
Normal file
23
aws/cdk/src/main/java/com/myorg/SecondStack.java
Normal file
@@ -0,0 +1,23 @@
|
||||
package com.myorg;
|
||||
|
||||
import software.amazon.awscdk.core.Construct;
|
||||
import software.amazon.awscdk.core.Stack;
|
||||
import software.amazon.awscdk.core.StackProps;
|
||||
import software.amazon.awscdk.services.s3.Bucket;
|
||||
|
||||
public class SecondStack extends Stack {
|
||||
public SecondStack(final Construct scope, final String id) {
|
||||
this(scope, id, null);
|
||||
}
|
||||
|
||||
public SecondStack(final Construct scope, final String id, final StackProps props) {
|
||||
super(scope, id, props);
|
||||
|
||||
String bucketName = (String) this.getNode().tryGetContext("bucketName2");
|
||||
|
||||
Bucket bucket = Bucket.Builder.create(this, "bucket")
|
||||
.bucketName(bucketName)
|
||||
.build();
|
||||
|
||||
}
|
||||
}
|
||||
117
aws/cdkv2/.mvn/wrapper/MavenWrapperDownloader.java
vendored
Normal file
117
aws/cdkv2/.mvn/wrapper/MavenWrapperDownloader.java
vendored
Normal file
@@ -0,0 +1,117 @@
|
||||
/*
|
||||
* Copyright 2007-present the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
import java.net.*;
|
||||
import java.io.*;
|
||||
import java.nio.channels.*;
|
||||
import java.util.Properties;
|
||||
|
||||
public class MavenWrapperDownloader {
|
||||
|
||||
private static final String WRAPPER_VERSION = "0.5.6";
|
||||
/**
|
||||
* Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
|
||||
*/
|
||||
private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
|
||||
+ WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
|
||||
|
||||
/**
|
||||
* Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
|
||||
* use instead of the default one.
|
||||
*/
|
||||
private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
|
||||
".mvn/wrapper/maven-wrapper.properties";
|
||||
|
||||
/**
|
||||
* Path where the maven-wrapper.jar will be saved to.
|
||||
*/
|
||||
private static final String MAVEN_WRAPPER_JAR_PATH =
|
||||
".mvn/wrapper/maven-wrapper.jar";
|
||||
|
||||
/**
|
||||
* Name of the property which should be used to override the default download url for the wrapper.
|
||||
*/
|
||||
private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
|
||||
|
||||
public static void main(String args[]) {
|
||||
System.out.println("- Downloader started");
|
||||
File baseDirectory = new File(args[0]);
|
||||
System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
|
||||
|
||||
// If the maven-wrapper.properties exists, read it and check if it contains a custom
|
||||
// wrapperUrl parameter.
|
||||
File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
|
||||
String url = DEFAULT_DOWNLOAD_URL;
|
||||
if(mavenWrapperPropertyFile.exists()) {
|
||||
FileInputStream mavenWrapperPropertyFileInputStream = null;
|
||||
try {
|
||||
mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
|
||||
Properties mavenWrapperProperties = new Properties();
|
||||
mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
|
||||
url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
|
||||
} catch (IOException e) {
|
||||
System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
|
||||
} finally {
|
||||
try {
|
||||
if(mavenWrapperPropertyFileInputStream != null) {
|
||||
mavenWrapperPropertyFileInputStream.close();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
// Ignore ...
|
||||
}
|
||||
}
|
||||
}
|
||||
System.out.println("- Downloading from: " + url);
|
||||
|
||||
File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
|
||||
if(!outputFile.getParentFile().exists()) {
|
||||
if(!outputFile.getParentFile().mkdirs()) {
|
||||
System.out.println(
|
||||
"- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
|
||||
}
|
||||
}
|
||||
System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
|
||||
try {
|
||||
downloadFileFromURL(url, outputFile);
|
||||
System.out.println("Done");
|
||||
System.exit(0);
|
||||
} catch (Throwable e) {
|
||||
System.out.println("- Error downloading");
|
||||
e.printStackTrace();
|
||||
System.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
private static void downloadFileFromURL(String urlString, File destination) throws Exception {
|
||||
if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
|
||||
String username = System.getenv("MVNW_USERNAME");
|
||||
char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
|
||||
Authenticator.setDefault(new Authenticator() {
|
||||
@Override
|
||||
protected PasswordAuthentication getPasswordAuthentication() {
|
||||
return new PasswordAuthentication(username, password);
|
||||
}
|
||||
});
|
||||
}
|
||||
URL website = new URL(urlString);
|
||||
ReadableByteChannel rbc;
|
||||
rbc = Channels.newChannel(website.openStream());
|
||||
FileOutputStream fos = new FileOutputStream(destination);
|
||||
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
|
||||
fos.close();
|
||||
rbc.close();
|
||||
}
|
||||
|
||||
}
|
||||
BIN
aws/cdkv2/.mvn/wrapper/maven-wrapper.jar
vendored
Normal file
BIN
aws/cdkv2/.mvn/wrapper/maven-wrapper.jar
vendored
Normal file
Binary file not shown.
2
aws/cdkv2/.mvn/wrapper/maven-wrapper.properties
vendored
Normal file
2
aws/cdkv2/.mvn/wrapper/maven-wrapper.properties
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip
|
||||
wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar
|
||||
8
aws/cdkv2/README.md
Normal file
8
aws/cdkv2/README.md
Normal file
@@ -0,0 +1,8 @@
|
||||
# Getting started with AWS CDK
|
||||
|
||||
|
||||
|
||||
Blog posts about this topic:
|
||||
|
||||
* [Getting started with AWS CDK](https://reflectoring.io/getting-started-with-aws-cdk/)
|
||||
|
||||
51
aws/cdkv2/cdk.context.json
Normal file
51
aws/cdkv2/cdk.context.json
Normal file
@@ -0,0 +1,51 @@
|
||||
{
|
||||
"vpc-provider:account=675153449441:filter.isDefault=true:region=us-east-1:returnAsymmetricSubnets=true": {
|
||||
"vpcId": "vpc-e5e76998",
|
||||
"vpcCidrBlock": "172.31.0.0/16",
|
||||
"availabilityZones": [],
|
||||
"subnetGroups": [
|
||||
{
|
||||
"name": "Public",
|
||||
"type": "Public",
|
||||
"subnets": [
|
||||
{
|
||||
"subnetId": "subnet-d71e66f6",
|
||||
"cidr": "172.31.80.0/20",
|
||||
"availabilityZone": "us-east-1a",
|
||||
"routeTableId": "rtb-ed425793"
|
||||
},
|
||||
{
|
||||
"subnetId": "subnet-1783815a",
|
||||
"cidr": "172.31.16.0/20",
|
||||
"availabilityZone": "us-east-1b",
|
||||
"routeTableId": "rtb-ed425793"
|
||||
},
|
||||
{
|
||||
"subnetId": "subnet-71d8a72e",
|
||||
"cidr": "172.31.32.0/20",
|
||||
"availabilityZone": "us-east-1c",
|
||||
"routeTableId": "rtb-ed425793"
|
||||
},
|
||||
{
|
||||
"subnetId": "subnet-7ee39118",
|
||||
"cidr": "172.31.0.0/20",
|
||||
"availabilityZone": "us-east-1d",
|
||||
"routeTableId": "rtb-ed425793"
|
||||
},
|
||||
{
|
||||
"subnetId": "subnet-a56bed94",
|
||||
"cidr": "172.31.48.0/20",
|
||||
"availabilityZone": "us-east-1e",
|
||||
"routeTableId": "rtb-ed425793"
|
||||
},
|
||||
{
|
||||
"subnetId": "subnet-cc1e2ac2",
|
||||
"cidr": "172.31.64.0/20",
|
||||
"availabilityZone": "us-east-1f",
|
||||
"routeTableId": "rtb-ed425793"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
27
aws/cdkv2/cdk.json
Normal file
27
aws/cdkv2/cdk.json
Normal file
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"app": "mvn -e -q compile exec:java",
|
||||
"watch": {
|
||||
"include": [
|
||||
"**"
|
||||
],
|
||||
"exclude": [
|
||||
"README.md",
|
||||
"cdk*.json",
|
||||
"target",
|
||||
"pom.xml",
|
||||
"src/test"
|
||||
]
|
||||
},
|
||||
"context": {
|
||||
"@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId": true,
|
||||
"@aws-cdk/core:stackRelativeExports": true,
|
||||
"@aws-cdk/aws-rds:lowercaseDbIdentifier": true,
|
||||
"@aws-cdk/aws-lambda:recognizeVersionProps": true,
|
||||
"@aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021": true,
|
||||
"@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true,
|
||||
"@aws-cdk/core:target-partitions": [
|
||||
"aws",
|
||||
"aws-cn"
|
||||
]
|
||||
}
|
||||
}
|
||||
310
aws/cdkv2/mvnw
vendored
Executable file
310
aws/cdkv2/mvnw
vendored
Executable file
@@ -0,0 +1,310 @@
|
||||
#!/bin/sh
|
||||
# ----------------------------------------------------------------------------
|
||||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# Maven Start Up Batch script
|
||||
#
|
||||
# Required ENV vars:
|
||||
# ------------------
|
||||
# JAVA_HOME - location of a JDK home dir
|
||||
#
|
||||
# Optional ENV vars
|
||||
# -----------------
|
||||
# M2_HOME - location of maven2's installed home dir
|
||||
# MAVEN_OPTS - parameters passed to the Java VM when running Maven
|
||||
# e.g. to debug Maven itself, use
|
||||
# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
|
||||
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
if [ -z "$MAVEN_SKIP_RC" ] ; then
|
||||
|
||||
if [ -f /etc/mavenrc ] ; then
|
||||
. /etc/mavenrc
|
||||
fi
|
||||
|
||||
if [ -f "$HOME/.mavenrc" ] ; then
|
||||
. "$HOME/.mavenrc"
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
# OS specific support. $var _must_ be set to either true or false.
|
||||
cygwin=false;
|
||||
darwin=false;
|
||||
mingw=false
|
||||
case "`uname`" in
|
||||
CYGWIN*) cygwin=true ;;
|
||||
MINGW*) mingw=true;;
|
||||
Darwin*) darwin=true
|
||||
# Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
|
||||
# See https://developer.apple.com/library/mac/qa/qa1170/_index.html
|
||||
if [ -z "$JAVA_HOME" ]; then
|
||||
if [ -x "/usr/libexec/java_home" ]; then
|
||||
export JAVA_HOME="`/usr/libexec/java_home`"
|
||||
else
|
||||
export JAVA_HOME="/Library/Java/Home"
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ -z "$JAVA_HOME" ] ; then
|
||||
if [ -r /etc/gentoo-release ] ; then
|
||||
JAVA_HOME=`java-config --jre-home`
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$M2_HOME" ] ; then
|
||||
## resolve links - $0 may be a link to maven's home
|
||||
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
|
||||
|
||||
saveddir=`pwd`
|
||||
|
||||
M2_HOME=`dirname "$PRG"`/..
|
||||
|
||||
# make it fully qualified
|
||||
M2_HOME=`cd "$M2_HOME" && pwd`
|
||||
|
||||
cd "$saveddir"
|
||||
# echo Using m2 at $M2_HOME
|
||||
fi
|
||||
|
||||
# For Cygwin, ensure paths are in UNIX format before anything is touched
|
||||
if $cygwin ; then
|
||||
[ -n "$M2_HOME" ] &&
|
||||
M2_HOME=`cygpath --unix "$M2_HOME"`
|
||||
[ -n "$JAVA_HOME" ] &&
|
||||
JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
|
||||
[ -n "$CLASSPATH" ] &&
|
||||
CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
|
||||
fi
|
||||
|
||||
# For Mingw, ensure paths are in UNIX format before anything is touched
|
||||
if $mingw ; then
|
||||
[ -n "$M2_HOME" ] &&
|
||||
M2_HOME="`(cd "$M2_HOME"; pwd)`"
|
||||
[ -n "$JAVA_HOME" ] &&
|
||||
JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
|
||||
fi
|
||||
|
||||
if [ -z "$JAVA_HOME" ]; then
|
||||
javaExecutable="`which javac`"
|
||||
if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
|
||||
# readlink(1) is not available as standard on Solaris 10.
|
||||
readLink=`which readlink`
|
||||
if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
|
||||
if $darwin ; then
|
||||
javaHome="`dirname \"$javaExecutable\"`"
|
||||
javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
|
||||
else
|
||||
javaExecutable="`readlink -f \"$javaExecutable\"`"
|
||||
fi
|
||||
javaHome="`dirname \"$javaExecutable\"`"
|
||||
javaHome=`expr "$javaHome" : '\(.*\)/bin'`
|
||||
JAVA_HOME="$javaHome"
|
||||
export JAVA_HOME
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$JAVACMD" ] ; then
|
||||
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
|
||||
else
|
||||
JAVACMD="`which java`"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ ! -x "$JAVACMD" ] ; then
|
||||
echo "Error: JAVA_HOME is not defined correctly." >&2
|
||||
echo " We cannot execute $JAVACMD" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$JAVA_HOME" ] ; then
|
||||
echo "Warning: JAVA_HOME environment variable is not set."
|
||||
fi
|
||||
|
||||
CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
|
||||
|
||||
# traverses directory structure from process work directory to filesystem root
|
||||
# first directory with .mvn subdirectory is considered project base directory
|
||||
find_maven_basedir() {
|
||||
|
||||
if [ -z "$1" ]
|
||||
then
|
||||
echo "Path not specified to find_maven_basedir"
|
||||
return 1
|
||||
fi
|
||||
|
||||
basedir="$1"
|
||||
wdir="$1"
|
||||
while [ "$wdir" != '/' ] ; do
|
||||
if [ -d "$wdir"/.mvn ] ; then
|
||||
basedir=$wdir
|
||||
break
|
||||
fi
|
||||
# workaround for JBEAP-8937 (on Solaris 10/Sparc)
|
||||
if [ -d "${wdir}" ]; then
|
||||
wdir=`cd "$wdir/.."; pwd`
|
||||
fi
|
||||
# end of workaround
|
||||
done
|
||||
echo "${basedir}"
|
||||
}
|
||||
|
||||
# concatenates all lines of a file
|
||||
concat_lines() {
|
||||
if [ -f "$1" ]; then
|
||||
echo "$(tr -s '\n' ' ' < "$1")"
|
||||
fi
|
||||
}
|
||||
|
||||
BASE_DIR=`find_maven_basedir "$(pwd)"`
|
||||
if [ -z "$BASE_DIR" ]; then
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
##########################################################################################
|
||||
# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
|
||||
# This allows using the maven wrapper in projects that prohibit checking in binary data.
|
||||
##########################################################################################
|
||||
if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Found .mvn/wrapper/maven-wrapper.jar"
|
||||
fi
|
||||
else
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
|
||||
fi
|
||||
if [ -n "$MVNW_REPOURL" ]; then
|
||||
jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
|
||||
else
|
||||
jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
|
||||
fi
|
||||
while IFS="=" read key value; do
|
||||
case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
|
||||
esac
|
||||
done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Downloading from: $jarUrl"
|
||||
fi
|
||||
wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
|
||||
if $cygwin; then
|
||||
wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
|
||||
fi
|
||||
|
||||
if command -v wget > /dev/null; then
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Found wget ... using wget"
|
||||
fi
|
||||
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
|
||||
wget "$jarUrl" -O "$wrapperJarPath"
|
||||
else
|
||||
wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath"
|
||||
fi
|
||||
elif command -v curl > /dev/null; then
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Found curl ... using curl"
|
||||
fi
|
||||
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
|
||||
curl -o "$wrapperJarPath" "$jarUrl" -f
|
||||
else
|
||||
curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
|
||||
fi
|
||||
|
||||
else
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Falling back to using Java to download"
|
||||
fi
|
||||
javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
|
||||
# For Cygwin, switch paths to Windows format before running javac
|
||||
if $cygwin; then
|
||||
javaClass=`cygpath --path --windows "$javaClass"`
|
||||
fi
|
||||
if [ -e "$javaClass" ]; then
|
||||
if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo " - Compiling MavenWrapperDownloader.java ..."
|
||||
fi
|
||||
# Compiling the Java class
|
||||
("$JAVA_HOME/bin/javac" "$javaClass")
|
||||
fi
|
||||
if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
|
||||
# Running the downloader
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo " - Running MavenWrapperDownloader.java ..."
|
||||
fi
|
||||
("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
##########################################################################################
|
||||
# End of extension
|
||||
##########################################################################################
|
||||
|
||||
export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo $MAVEN_PROJECTBASEDIR
|
||||
fi
|
||||
MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
|
||||
|
||||
# For Cygwin, switch paths to Windows format before running java
|
||||
if $cygwin; then
|
||||
[ -n "$M2_HOME" ] &&
|
||||
M2_HOME=`cygpath --path --windows "$M2_HOME"`
|
||||
[ -n "$JAVA_HOME" ] &&
|
||||
JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
|
||||
[ -n "$CLASSPATH" ] &&
|
||||
CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
|
||||
[ -n "$MAVEN_PROJECTBASEDIR" ] &&
|
||||
MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
|
||||
fi
|
||||
|
||||
# Provide a "standardized" way to retrieve the CLI args that will
|
||||
# work with both Windows and non-Windows executions.
|
||||
MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
|
||||
export MAVEN_CMD_LINE_ARGS
|
||||
|
||||
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
|
||||
|
||||
exec "$JAVACMD" \
|
||||
$MAVEN_OPTS \
|
||||
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
|
||||
"-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
|
||||
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
|
||||
182
aws/cdkv2/mvnw.cmd
vendored
Normal file
182
aws/cdkv2/mvnw.cmd
vendored
Normal file
@@ -0,0 +1,182 @@
|
||||
@REM ----------------------------------------------------------------------------
|
||||
@REM Licensed to the Apache Software Foundation (ASF) under one
|
||||
@REM or more contributor license agreements. See the NOTICE file
|
||||
@REM distributed with this work for additional information
|
||||
@REM regarding copyright ownership. The ASF licenses this file
|
||||
@REM to you under the Apache License, Version 2.0 (the
|
||||
@REM "License"); you may not use this file except in compliance
|
||||
@REM with the License. You may obtain a copy of the License at
|
||||
@REM
|
||||
@REM http://www.apache.org/licenses/LICENSE-2.0
|
||||
@REM
|
||||
@REM Unless required by applicable law or agreed to in writing,
|
||||
@REM software distributed under the License is distributed on an
|
||||
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
@REM KIND, either express or implied. See the License for the
|
||||
@REM specific language governing permissions and limitations
|
||||
@REM under the License.
|
||||
@REM ----------------------------------------------------------------------------
|
||||
|
||||
@REM ----------------------------------------------------------------------------
|
||||
@REM Maven Start Up Batch script
|
||||
@REM
|
||||
@REM Required ENV vars:
|
||||
@REM JAVA_HOME - location of a JDK home dir
|
||||
@REM
|
||||
@REM Optional ENV vars
|
||||
@REM M2_HOME - location of maven2's installed home dir
|
||||
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
|
||||
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
|
||||
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
|
||||
@REM e.g. to debug Maven itself, use
|
||||
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
|
||||
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
|
||||
@REM ----------------------------------------------------------------------------
|
||||
|
||||
@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
|
||||
@echo off
|
||||
@REM set title of command window
|
||||
title %0
|
||||
@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
|
||||
@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
|
||||
|
||||
@REM set %HOME% to equivalent of $HOME
|
||||
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
|
||||
|
||||
@REM Execute a user defined script before this one
|
||||
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
|
||||
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
|
||||
if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
|
||||
if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
|
||||
:skipRcPre
|
||||
|
||||
@setlocal
|
||||
|
||||
set ERROR_CODE=0
|
||||
|
||||
@REM To isolate internal variables from possible post scripts, we use another setlocal
|
||||
@setlocal
|
||||
|
||||
@REM ==== START VALIDATION ====
|
||||
if not "%JAVA_HOME%" == "" goto OkJHome
|
||||
|
||||
echo.
|
||||
echo Error: JAVA_HOME not found in your environment. >&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the >&2
|
||||
echo location of your Java installation. >&2
|
||||
echo.
|
||||
goto error
|
||||
|
||||
:OkJHome
|
||||
if exist "%JAVA_HOME%\bin\java.exe" goto init
|
||||
|
||||
echo.
|
||||
echo Error: JAVA_HOME is set to an invalid directory. >&2
|
||||
echo JAVA_HOME = "%JAVA_HOME%" >&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the >&2
|
||||
echo location of your Java installation. >&2
|
||||
echo.
|
||||
goto error
|
||||
|
||||
@REM ==== END VALIDATION ====
|
||||
|
||||
:init
|
||||
|
||||
@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
|
||||
@REM Fallback to current working directory if not found.
|
||||
|
||||
set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
|
||||
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
|
||||
|
||||
set EXEC_DIR=%CD%
|
||||
set WDIR=%EXEC_DIR%
|
||||
:findBaseDir
|
||||
IF EXIST "%WDIR%"\.mvn goto baseDirFound
|
||||
cd ..
|
||||
IF "%WDIR%"=="%CD%" goto baseDirNotFound
|
||||
set WDIR=%CD%
|
||||
goto findBaseDir
|
||||
|
||||
:baseDirFound
|
||||
set MAVEN_PROJECTBASEDIR=%WDIR%
|
||||
cd "%EXEC_DIR%"
|
||||
goto endDetectBaseDir
|
||||
|
||||
:baseDirNotFound
|
||||
set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
|
||||
cd "%EXEC_DIR%"
|
||||
|
||||
:endDetectBaseDir
|
||||
|
||||
IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
|
||||
|
||||
@setlocal EnableExtensions EnableDelayedExpansion
|
||||
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
|
||||
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
|
||||
|
||||
:endReadAdditionalConfig
|
||||
|
||||
SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
|
||||
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
|
||||
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
|
||||
|
||||
set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
|
||||
|
||||
FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
|
||||
IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
|
||||
)
|
||||
|
||||
@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
|
||||
@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
|
||||
if exist %WRAPPER_JAR% (
|
||||
if "%MVNW_VERBOSE%" == "true" (
|
||||
echo Found %WRAPPER_JAR%
|
||||
)
|
||||
) else (
|
||||
if not "%MVNW_REPOURL%" == "" (
|
||||
SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
|
||||
)
|
||||
if "%MVNW_VERBOSE%" == "true" (
|
||||
echo Couldn't find %WRAPPER_JAR%, downloading it ...
|
||||
echo Downloading from: %DOWNLOAD_URL%
|
||||
)
|
||||
|
||||
powershell -Command "&{"^
|
||||
"$webclient = new-object System.Net.WebClient;"^
|
||||
"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
|
||||
"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
|
||||
"}"^
|
||||
"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
|
||||
"}"
|
||||
if "%MVNW_VERBOSE%" == "true" (
|
||||
echo Finished downloading %WRAPPER_JAR%
|
||||
)
|
||||
)
|
||||
@REM End of extension
|
||||
|
||||
@REM Provide a "standardized" way to retrieve the CLI args that will
|
||||
@REM work with both Windows and non-Windows executions.
|
||||
set MAVEN_CMD_LINE_ARGS=%*
|
||||
|
||||
%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
|
||||
if ERRORLEVEL 1 goto error
|
||||
goto end
|
||||
|
||||
:error
|
||||
set ERROR_CODE=1
|
||||
|
||||
:end
|
||||
@endlocal & set ERROR_CODE=%ERROR_CODE%
|
||||
|
||||
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
|
||||
@REM check for post script, once with legacy .bat ending and once with .cmd ending
|
||||
if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
|
||||
if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
|
||||
:skipRcPost
|
||||
|
||||
@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
|
||||
if "%MAVEN_BATCH_PAUSE%" == "on" pause
|
||||
|
||||
if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
|
||||
|
||||
exit /B %ERROR_CODE%
|
||||
61
aws/cdkv2/pom.xml
Normal file
61
aws/cdkv2/pom.xml
Normal file
@@ -0,0 +1,61 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
|
||||
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>com.myorg</groupId>
|
||||
<artifactId>cdk-app</artifactId>
|
||||
<version>0.1</version>
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<cdk.version>2.8.0</cdk.version>
|
||||
<constructs.version>[10.0.0,11.0.0)</constructs.version>
|
||||
<junit.version>5.7.1</junit.version>
|
||||
</properties>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.8.1</version>
|
||||
<configuration>
|
||||
<source>1.8</source>
|
||||
<target>1.8</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>exec-maven-plugin</artifactId>
|
||||
<version>3.0.0</version>
|
||||
<configuration>
|
||||
<mainClass>com.myorg.CdkAppApp</mainClass>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
<dependencies>
|
||||
<!-- AWS Cloud Development Kit -->
|
||||
<dependency>
|
||||
<groupId>software.amazon.awscdk</groupId>
|
||||
<artifactId>aws-cdk-lib</artifactId>
|
||||
<version>${cdk.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>software.constructs</groupId>
|
||||
<artifactId>constructs</artifactId>
|
||||
<version>${constructs.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.junit.jupiter</groupId>
|
||||
<artifactId>junit-jupiter</artifactId>
|
||||
<version>${junit.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
25
aws/cdkv2/src/main/java/com/myorg/CdkAppApp.java
Normal file
25
aws/cdkv2/src/main/java/com/myorg/CdkAppApp.java
Normal file
@@ -0,0 +1,25 @@
|
||||
package com.myorg;
|
||||
|
||||
import software.amazon.awscdk.App;
|
||||
import software.amazon.awscdk.Environment;
|
||||
import software.amazon.awscdk.StackProps;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
public class CdkAppApp {
|
||||
public static void main(final String[] args) {
|
||||
App app = new App();
|
||||
|
||||
new CdkAppStack(app, "CdkAppStack", StackProps.builder()
|
||||
|
||||
.env(Environment.builder()
|
||||
.account("**********")
|
||||
.region("us-east-1")
|
||||
.build())
|
||||
|
||||
.build());
|
||||
|
||||
app.synth();
|
||||
}
|
||||
}
|
||||
|
||||
63
aws/cdkv2/src/main/java/com/myorg/CdkAppStack.java
Normal file
63
aws/cdkv2/src/main/java/com/myorg/CdkAppStack.java
Normal file
@@ -0,0 +1,63 @@
|
||||
package com.myorg;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import software.amazon.awscdk.Stack;
|
||||
import software.amazon.awscdk.StackProps;
|
||||
import software.amazon.awscdk.services.ec2.BlockDeviceVolume;
|
||||
import software.amazon.awscdk.services.ec2.BlockDevice;
|
||||
import software.amazon.awscdk.services.ec2.IMachineImage;
|
||||
import software.amazon.awscdk.services.ec2.IVpc;
|
||||
import software.amazon.awscdk.services.ec2.Instance;
|
||||
import software.amazon.awscdk.services.ec2.InstanceClass;
|
||||
import software.amazon.awscdk.services.ec2.InstanceSize;
|
||||
import software.amazon.awscdk.services.ec2.InstanceType;
|
||||
import software.amazon.awscdk.services.ec2.MachineImage;
|
||||
import software.amazon.awscdk.services.ec2.SecurityGroup;
|
||||
import software.amazon.awscdk.services.ec2.Vpc;
|
||||
import software.amazon.awscdk.services.ec2.VpcLookupOptions;
|
||||
import software.constructs.Construct;
|
||||
// import software.amazon.awscdk.Duration;
|
||||
// import software.amazon.awscdk.services.sqs.Queue;
|
||||
|
||||
public class CdkAppStack extends Stack {
|
||||
public CdkAppStack(final Construct scope, final String id) {
|
||||
this(scope, id, null);
|
||||
}
|
||||
|
||||
public CdkAppStack(final Construct scope, final String id, final StackProps props) {
|
||||
super(scope, id, props);
|
||||
|
||||
|
||||
|
||||
VpcLookupOptions options = VpcLookupOptions.builder().isDefault(true).build();
|
||||
IVpc vpc = Vpc.fromLookup(this, "vpc", options);
|
||||
|
||||
|
||||
SecurityGroup securityGroup = SecurityGroup
|
||||
.Builder
|
||||
.create(this, "sg")
|
||||
.vpc(vpc)
|
||||
.allowAllOutbound(true)
|
||||
.build();
|
||||
|
||||
|
||||
|
||||
Instance.Builder.create(this, "Instance")
|
||||
.vpc(vpc)
|
||||
.instanceType(InstanceType.of(InstanceClass.BURSTABLE2, InstanceSize.MICRO))
|
||||
.machineImage(MachineImage.latestAmazonLinux())
|
||||
.blockDevices(List.of(BlockDevice.builder()
|
||||
.deviceName("/dev/sda1")
|
||||
.volume(BlockDeviceVolume.ebs(50))
|
||||
.build(), BlockDevice.builder()
|
||||
.deviceName("/dev/sdm")
|
||||
.volume(BlockDeviceVolume.ebs(100))
|
||||
.build()))
|
||||
.securityGroup(securityGroup)
|
||||
.build();
|
||||
|
||||
}
|
||||
}
|
||||
34
aws/cdkv2/src/main/java/com/myorg/MyStorageBucket.java
Normal file
34
aws/cdkv2/src/main/java/com/myorg/MyStorageBucket.java
Normal file
@@ -0,0 +1,34 @@
|
||||
/**
|
||||
*
|
||||
*/
|
||||
package com.myorg;
|
||||
|
||||
|
||||
|
||||
import software.amazon.awscdk.Duration;
|
||||
import software.amazon.awscdk.services.s3.Bucket;
|
||||
import software.amazon.awscdk.services.s3.LifecycleRule;
|
||||
import software.constructs.Construct;
|
||||
|
||||
/**
|
||||
* @author pratikdas
|
||||
*
|
||||
*/
|
||||
public class MyStorageBucket extends Construct{
|
||||
|
||||
public MyStorageBucket(final Construct scope, final String id) {
|
||||
super(scope, id);
|
||||
Bucket bucket = new Bucket(this, "mybucket");
|
||||
|
||||
LifecycleRule lifecycleRule = LifecycleRule.builder()
|
||||
.abortIncompleteMultipartUploadAfter(Duration.minutes(30))
|
||||
.enabled(false)
|
||||
.expiration(Duration.minutes(30))
|
||||
.expiredObjectDeleteMarker(false)
|
||||
.id("id").build();
|
||||
|
||||
bucket.addLifecycleRule(lifecycleRule);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
26
aws/cdkv2/src/test/java/com/myorg/CdkAppTest.java
Normal file
26
aws/cdkv2/src/test/java/com/myorg/CdkAppTest.java
Normal file
@@ -0,0 +1,26 @@
|
||||
// package com.myorg;
|
||||
|
||||
// import software.amazon.awscdk.App;
|
||||
// import software.amazon.awscdk.assertions.Template;
|
||||
// import java.io.IOException;
|
||||
|
||||
// import java.util.HashMap;
|
||||
|
||||
// import org.junit.jupiter.api.Test;
|
||||
|
||||
// example test. To run these tests, uncomment this file, along with the
|
||||
// example resource in java/src/main/java/com/myorg/CdkAppStack.java
|
||||
// public class CdkAppTest {
|
||||
|
||||
// @Test
|
||||
// public void testStack() throws IOException {
|
||||
// App app = new App();
|
||||
// CdkAppStack stack = new CdkAppStack(app, "test");
|
||||
|
||||
// Template template = Template.fromStack(stack);
|
||||
|
||||
// template.hasResourceProperties("AWS::SQS::Queue", new HashMap<String, Number>() {{
|
||||
// put("VisibilityTimeout", 300);
|
||||
// }});
|
||||
// }
|
||||
// }
|
||||
BIN
aws/kinesis/.mvn/wrapper/maven-wrapper.jar
vendored
Normal file
BIN
aws/kinesis/.mvn/wrapper/maven-wrapper.jar
vendored
Normal file
Binary file not shown.
18
aws/kinesis/.mvn/wrapper/maven-wrapper.properties
vendored
Normal file
18
aws/kinesis/.mvn/wrapper/maven-wrapper.properties
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip
|
||||
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar
|
||||
8
aws/kinesis/README.md
Normal file
8
aws/kinesis/README.md
Normal file
@@ -0,0 +1,8 @@
|
||||
# Getting started with AWS Kinesis
|
||||
|
||||
|
||||
|
||||
Blog posts about this topic:
|
||||
|
||||
* [Getting started with AWS Kinesis](https://reflectoring.io/getting-started-with-aws-kinesis/)
|
||||
|
||||
316
aws/kinesis/mvnw
vendored
Executable file
316
aws/kinesis/mvnw
vendored
Executable file
@@ -0,0 +1,316 @@
|
||||
#!/bin/sh
|
||||
# ----------------------------------------------------------------------------
|
||||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# Maven Start Up Batch script
|
||||
#
|
||||
# Required ENV vars:
|
||||
# ------------------
|
||||
# JAVA_HOME - location of a JDK home dir
|
||||
#
|
||||
# Optional ENV vars
|
||||
# -----------------
|
||||
# M2_HOME - location of maven2's installed home dir
|
||||
# MAVEN_OPTS - parameters passed to the Java VM when running Maven
|
||||
# e.g. to debug Maven itself, use
|
||||
# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
|
||||
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
if [ -z "$MAVEN_SKIP_RC" ] ; then
|
||||
|
||||
if [ -f /usr/local/etc/mavenrc ] ; then
|
||||
. /usr/local/etc/mavenrc
|
||||
fi
|
||||
|
||||
if [ -f /etc/mavenrc ] ; then
|
||||
. /etc/mavenrc
|
||||
fi
|
||||
|
||||
if [ -f "$HOME/.mavenrc" ] ; then
|
||||
. "$HOME/.mavenrc"
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
# OS specific support. $var _must_ be set to either true or false.
|
||||
cygwin=false;
|
||||
darwin=false;
|
||||
mingw=false
|
||||
case "`uname`" in
|
||||
CYGWIN*) cygwin=true ;;
|
||||
MINGW*) mingw=true;;
|
||||
Darwin*) darwin=true
|
||||
# Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
|
||||
# See https://developer.apple.com/library/mac/qa/qa1170/_index.html
|
||||
if [ -z "$JAVA_HOME" ]; then
|
||||
if [ -x "/usr/libexec/java_home" ]; then
|
||||
export JAVA_HOME="`/usr/libexec/java_home`"
|
||||
else
|
||||
export JAVA_HOME="/Library/Java/Home"
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ -z "$JAVA_HOME" ] ; then
|
||||
if [ -r /etc/gentoo-release ] ; then
|
||||
JAVA_HOME=`java-config --jre-home`
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$M2_HOME" ] ; then
|
||||
## resolve links - $0 may be a link to maven's home
|
||||
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
|
||||
|
||||
saveddir=`pwd`
|
||||
|
||||
M2_HOME=`dirname "$PRG"`/..
|
||||
|
||||
# make it fully qualified
|
||||
M2_HOME=`cd "$M2_HOME" && pwd`
|
||||
|
||||
cd "$saveddir"
|
||||
# echo Using m2 at $M2_HOME
|
||||
fi
|
||||
|
||||
# For Cygwin, ensure paths are in UNIX format before anything is touched
|
||||
if $cygwin ; then
|
||||
[ -n "$M2_HOME" ] &&
|
||||
M2_HOME=`cygpath --unix "$M2_HOME"`
|
||||
[ -n "$JAVA_HOME" ] &&
|
||||
JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
|
||||
[ -n "$CLASSPATH" ] &&
|
||||
CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
|
||||
fi
|
||||
|
||||
# For Mingw, ensure paths are in UNIX format before anything is touched
|
||||
if $mingw ; then
|
||||
[ -n "$M2_HOME" ] &&
|
||||
M2_HOME="`(cd "$M2_HOME"; pwd)`"
|
||||
[ -n "$JAVA_HOME" ] &&
|
||||
JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
|
||||
fi
|
||||
|
||||
if [ -z "$JAVA_HOME" ]; then
|
||||
javaExecutable="`which javac`"
|
||||
if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
|
||||
# readlink(1) is not available as standard on Solaris 10.
|
||||
readLink=`which readlink`
|
||||
if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
|
||||
if $darwin ; then
|
||||
javaHome="`dirname \"$javaExecutable\"`"
|
||||
javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
|
||||
else
|
||||
javaExecutable="`readlink -f \"$javaExecutable\"`"
|
||||
fi
|
||||
javaHome="`dirname \"$javaExecutable\"`"
|
||||
javaHome=`expr "$javaHome" : '\(.*\)/bin'`
|
||||
JAVA_HOME="$javaHome"
|
||||
export JAVA_HOME
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$JAVACMD" ] ; then
|
||||
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
|
||||
else
|
||||
JAVACMD="`\\unset -f command; \\command -v java`"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ ! -x "$JAVACMD" ] ; then
|
||||
echo "Error: JAVA_HOME is not defined correctly." >&2
|
||||
echo " We cannot execute $JAVACMD" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$JAVA_HOME" ] ; then
|
||||
echo "Warning: JAVA_HOME environment variable is not set."
|
||||
fi
|
||||
|
||||
CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
|
||||
|
||||
# traverses directory structure from process work directory to filesystem root
|
||||
# first directory with .mvn subdirectory is considered project base directory
|
||||
find_maven_basedir() {
|
||||
|
||||
if [ -z "$1" ]
|
||||
then
|
||||
echo "Path not specified to find_maven_basedir"
|
||||
return 1
|
||||
fi
|
||||
|
||||
basedir="$1"
|
||||
wdir="$1"
|
||||
while [ "$wdir" != '/' ] ; do
|
||||
if [ -d "$wdir"/.mvn ] ; then
|
||||
basedir=$wdir
|
||||
break
|
||||
fi
|
||||
# workaround for JBEAP-8937 (on Solaris 10/Sparc)
|
||||
if [ -d "${wdir}" ]; then
|
||||
wdir=`cd "$wdir/.."; pwd`
|
||||
fi
|
||||
# end of workaround
|
||||
done
|
||||
echo "${basedir}"
|
||||
}
|
||||
|
||||
# concatenates all lines of a file
|
||||
concat_lines() {
|
||||
if [ -f "$1" ]; then
|
||||
echo "$(tr -s '\n' ' ' < "$1")"
|
||||
fi
|
||||
}
|
||||
|
||||
BASE_DIR=`find_maven_basedir "$(pwd)"`
|
||||
if [ -z "$BASE_DIR" ]; then
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
##########################################################################################
|
||||
# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
|
||||
# This allows using the maven wrapper in projects that prohibit checking in binary data.
|
||||
##########################################################################################
|
||||
if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Found .mvn/wrapper/maven-wrapper.jar"
|
||||
fi
|
||||
else
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
|
||||
fi
|
||||
if [ -n "$MVNW_REPOURL" ]; then
|
||||
jarUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
|
||||
else
|
||||
jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
|
||||
fi
|
||||
while IFS="=" read key value; do
|
||||
case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
|
||||
esac
|
||||
done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Downloading from: $jarUrl"
|
||||
fi
|
||||
wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
|
||||
if $cygwin; then
|
||||
wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
|
||||
fi
|
||||
|
||||
if command -v wget > /dev/null; then
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Found wget ... using wget"
|
||||
fi
|
||||
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
|
||||
wget "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
|
||||
else
|
||||
wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
|
||||
fi
|
||||
elif command -v curl > /dev/null; then
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Found curl ... using curl"
|
||||
fi
|
||||
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
|
||||
curl -o "$wrapperJarPath" "$jarUrl" -f
|
||||
else
|
||||
curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
|
||||
fi
|
||||
|
||||
else
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Falling back to using Java to download"
|
||||
fi
|
||||
javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
|
||||
# For Cygwin, switch paths to Windows format before running javac
|
||||
if $cygwin; then
|
||||
javaClass=`cygpath --path --windows "$javaClass"`
|
||||
fi
|
||||
if [ -e "$javaClass" ]; then
|
||||
if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo " - Compiling MavenWrapperDownloader.java ..."
|
||||
fi
|
||||
# Compiling the Java class
|
||||
("$JAVA_HOME/bin/javac" "$javaClass")
|
||||
fi
|
||||
if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
|
||||
# Running the downloader
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo " - Running MavenWrapperDownloader.java ..."
|
||||
fi
|
||||
("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
##########################################################################################
|
||||
# End of extension
|
||||
##########################################################################################
|
||||
|
||||
export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo $MAVEN_PROJECTBASEDIR
|
||||
fi
|
||||
MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
|
||||
|
||||
# For Cygwin, switch paths to Windows format before running java
|
||||
if $cygwin; then
|
||||
[ -n "$M2_HOME" ] &&
|
||||
M2_HOME=`cygpath --path --windows "$M2_HOME"`
|
||||
[ -n "$JAVA_HOME" ] &&
|
||||
JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
|
||||
[ -n "$CLASSPATH" ] &&
|
||||
CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
|
||||
[ -n "$MAVEN_PROJECTBASEDIR" ] &&
|
||||
MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
|
||||
fi
|
||||
|
||||
# Provide a "standardized" way to retrieve the CLI args that will
|
||||
# work with both Windows and non-Windows executions.
|
||||
MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
|
||||
export MAVEN_CMD_LINE_ARGS
|
||||
|
||||
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
|
||||
|
||||
exec "$JAVACMD" \
|
||||
$MAVEN_OPTS \
|
||||
$MAVEN_DEBUG_OPTS \
|
||||
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
|
||||
"-Dmaven.home=${M2_HOME}" \
|
||||
"-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
|
||||
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
|
||||
188
aws/kinesis/mvnw.cmd
vendored
Normal file
188
aws/kinesis/mvnw.cmd
vendored
Normal file
@@ -0,0 +1,188 @@
|
||||
@REM ----------------------------------------------------------------------------
|
||||
@REM Licensed to the Apache Software Foundation (ASF) under one
|
||||
@REM or more contributor license agreements. See the NOTICE file
|
||||
@REM distributed with this work for additional information
|
||||
@REM regarding copyright ownership. The ASF licenses this file
|
||||
@REM to you under the Apache License, Version 2.0 (the
|
||||
@REM "License"); you may not use this file except in compliance
|
||||
@REM with the License. You may obtain a copy of the License at
|
||||
@REM
|
||||
@REM http://www.apache.org/licenses/LICENSE-2.0
|
||||
@REM
|
||||
@REM Unless required by applicable law or agreed to in writing,
|
||||
@REM software distributed under the License is distributed on an
|
||||
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
@REM KIND, either express or implied. See the License for the
|
||||
@REM specific language governing permissions and limitations
|
||||
@REM under the License.
|
||||
@REM ----------------------------------------------------------------------------
|
||||
|
||||
@REM ----------------------------------------------------------------------------
|
||||
@REM Maven Start Up Batch script
|
||||
@REM
|
||||
@REM Required ENV vars:
|
||||
@REM JAVA_HOME - location of a JDK home dir
|
||||
@REM
|
||||
@REM Optional ENV vars
|
||||
@REM M2_HOME - location of maven2's installed home dir
|
||||
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
|
||||
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
|
||||
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
|
||||
@REM e.g. to debug Maven itself, use
|
||||
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
|
||||
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
|
||||
@REM ----------------------------------------------------------------------------
|
||||
|
||||
@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
|
||||
@echo off
|
||||
@REM set title of command window
|
||||
title %0
|
||||
@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
|
||||
@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
|
||||
|
||||
@REM set %HOME% to equivalent of $HOME
|
||||
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
|
||||
|
||||
@REM Execute a user defined script before this one
|
||||
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
|
||||
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
|
||||
if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %*
|
||||
if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %*
|
||||
:skipRcPre
|
||||
|
||||
@setlocal
|
||||
|
||||
set ERROR_CODE=0
|
||||
|
||||
@REM To isolate internal variables from possible post scripts, we use another setlocal
|
||||
@setlocal
|
||||
|
||||
@REM ==== START VALIDATION ====
|
||||
if not "%JAVA_HOME%" == "" goto OkJHome
|
||||
|
||||
echo.
|
||||
echo Error: JAVA_HOME not found in your environment. >&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the >&2
|
||||
echo location of your Java installation. >&2
|
||||
echo.
|
||||
goto error
|
||||
|
||||
:OkJHome
|
||||
if exist "%JAVA_HOME%\bin\java.exe" goto init
|
||||
|
||||
echo.
|
||||
echo Error: JAVA_HOME is set to an invalid directory. >&2
|
||||
echo JAVA_HOME = "%JAVA_HOME%" >&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the >&2
|
||||
echo location of your Java installation. >&2
|
||||
echo.
|
||||
goto error
|
||||
|
||||
@REM ==== END VALIDATION ====
|
||||
|
||||
:init
|
||||
|
||||
@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
|
||||
@REM Fallback to current working directory if not found.
|
||||
|
||||
set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
|
||||
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
|
||||
|
||||
set EXEC_DIR=%CD%
|
||||
set WDIR=%EXEC_DIR%
|
||||
:findBaseDir
|
||||
IF EXIST "%WDIR%"\.mvn goto baseDirFound
|
||||
cd ..
|
||||
IF "%WDIR%"=="%CD%" goto baseDirNotFound
|
||||
set WDIR=%CD%
|
||||
goto findBaseDir
|
||||
|
||||
:baseDirFound
|
||||
set MAVEN_PROJECTBASEDIR=%WDIR%
|
||||
cd "%EXEC_DIR%"
|
||||
goto endDetectBaseDir
|
||||
|
||||
:baseDirNotFound
|
||||
set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
|
||||
cd "%EXEC_DIR%"
|
||||
|
||||
:endDetectBaseDir
|
||||
|
||||
IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
|
||||
|
||||
@setlocal EnableExtensions EnableDelayedExpansion
|
||||
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
|
||||
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
|
||||
|
||||
:endReadAdditionalConfig
|
||||
|
||||
SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
|
||||
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
|
||||
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
|
||||
|
||||
set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
|
||||
|
||||
FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
|
||||
IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
|
||||
)
|
||||
|
||||
@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
|
||||
@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
|
||||
if exist %WRAPPER_JAR% (
|
||||
if "%MVNW_VERBOSE%" == "true" (
|
||||
echo Found %WRAPPER_JAR%
|
||||
)
|
||||
) else (
|
||||
if not "%MVNW_REPOURL%" == "" (
|
||||
SET DOWNLOAD_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
|
||||
)
|
||||
if "%MVNW_VERBOSE%" == "true" (
|
||||
echo Couldn't find %WRAPPER_JAR%, downloading it ...
|
||||
echo Downloading from: %DOWNLOAD_URL%
|
||||
)
|
||||
|
||||
powershell -Command "&{"^
|
||||
"$webclient = new-object System.Net.WebClient;"^
|
||||
"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
|
||||
"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
|
||||
"}"^
|
||||
"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
|
||||
"}"
|
||||
if "%MVNW_VERBOSE%" == "true" (
|
||||
echo Finished downloading %WRAPPER_JAR%
|
||||
)
|
||||
)
|
||||
@REM End of extension
|
||||
|
||||
@REM Provide a "standardized" way to retrieve the CLI args that will
|
||||
@REM work with both Windows and non-Windows executions.
|
||||
set MAVEN_CMD_LINE_ARGS=%*
|
||||
|
||||
%MAVEN_JAVA_EXE% ^
|
||||
%JVM_CONFIG_MAVEN_PROPS% ^
|
||||
%MAVEN_OPTS% ^
|
||||
%MAVEN_DEBUG_OPTS% ^
|
||||
-classpath %WRAPPER_JAR% ^
|
||||
"-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^
|
||||
%WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
|
||||
if ERRORLEVEL 1 goto error
|
||||
goto end
|
||||
|
||||
:error
|
||||
set ERROR_CODE=1
|
||||
|
||||
:end
|
||||
@endlocal & set ERROR_CODE=%ERROR_CODE%
|
||||
|
||||
if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost
|
||||
@REM check for post script, once with legacy .bat ending and once with .cmd ending
|
||||
if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat"
|
||||
if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd"
|
||||
:skipRcPost
|
||||
|
||||
@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
|
||||
if "%MAVEN_BATCH_PAUSE%"=="on" pause
|
||||
|
||||
if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE%
|
||||
|
||||
cmd /C exit /B %ERROR_CODE%
|
||||
72
aws/kinesis/pom.xml
Normal file
72
aws/kinesis/pom.xml
Normal file
@@ -0,0 +1,72 @@
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>io.pratik</groupId>
|
||||
<artifactId>kinesisexamples</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
<properties>
|
||||
<maven.compiler.source>1.8</maven.compiler.source>
|
||||
<maven.compiler.target>1.8</maven.compiler.target>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>software.amazon.awssdk</groupId>
|
||||
<artifactId>kinesis</artifactId>
|
||||
</dependency>
|
||||
<!-- <dependency> <groupId>com.amazonaws</groupId> <artifactId>amazon-kinesis-producer</artifactId>
|
||||
<version>0.14.10</version> </dependency> <dependency> <groupId>software.amazon.kinesis</groupId>
|
||||
<artifactId>amazon-kinesis-client</artifactId> <version>2.3.10</version>
|
||||
</dependency> -->
|
||||
<dependency>
|
||||
<groupId>software.amazon.awssdk</groupId>
|
||||
<artifactId>firehose</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>software.amazon.awssdk</groupId>
|
||||
<artifactId>kinesisanalyticsv2</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>software.amazon.awssdk</groupId>
|
||||
<artifactId>kinesisvideo</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>software.amazon.awssdk</groupId>
|
||||
<artifactId>kinesisvideomedia</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.amazonaws</groupId>
|
||||
<artifactId>amazon-kinesis-video-streams-producer-sdk-java</artifactId>
|
||||
<version>1.12.0</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.flink</groupId>
|
||||
<artifactId>flink-streaming-java_2.11</artifactId>
|
||||
<version>1.14.3</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.flink</groupId>
|
||||
<artifactId>flink-clients_2.11</artifactId>
|
||||
<version>1.14.3</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>software.amazon.kinesis</groupId>
|
||||
<artifactId>amazon-kinesis-connector-flink</artifactId>
|
||||
<version>2.3.0</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<dependencyManagement>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>software.amazon.awssdk</groupId>
|
||||
<artifactId>bom</artifactId>
|
||||
<version>2.17.116</version>
|
||||
<type>pom</type>
|
||||
<scope>import</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</dependencyManagement>
|
||||
</project>
|
||||
16
aws/kinesis/src/main/java/io/pratik/Constants.java
Normal file
16
aws/kinesis/src/main/java/io/pratik/Constants.java
Normal file
@@ -0,0 +1,16 @@
|
||||
/**
|
||||
*
|
||||
*/
|
||||
package io.pratik;
|
||||
|
||||
import software.amazon.awssdk.regions.Region;
|
||||
|
||||
/**
|
||||
* @author pratikdas
|
||||
*
|
||||
*/
|
||||
public interface Constants {
|
||||
String MY_DATA_STREAM = "mydatastream";
|
||||
String AWS_PROFILE_NAME = "tompoc";
|
||||
Region AWS_REGION = Region.AP_SOUTHEAST_2;
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
/**
|
||||
*
|
||||
*/
|
||||
package io.pratik;
|
||||
|
||||
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
|
||||
import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
|
||||
import software.amazon.awssdk.regions.Region;
|
||||
import software.amazon.awssdk.services.kinesis.KinesisClient;
|
||||
import software.amazon.awssdk.services.kinesis.model.CreateStreamRequest;
|
||||
import software.amazon.awssdk.services.kinesis.model.CreateStreamResponse;
|
||||
import software.amazon.awssdk.services.kinesis.model.DescribeStreamSummaryRequest;
|
||||
import software.amazon.awssdk.services.kinesis.model.DescribeStreamSummaryResponse;
|
||||
import software.amazon.awssdk.services.kinesis.model.ResourceNotFoundException;
|
||||
import software.amazon.awssdk.services.kinesis.model.StreamDescriptionSummary;
|
||||
import software.amazon.awssdk.services.kinesis.model.StreamMode;
|
||||
import software.amazon.awssdk.services.kinesis.model.StreamModeDetails;
|
||||
import software.amazon.awssdk.services.kinesis.model.StreamStatus;
|
||||
|
||||
/**
|
||||
* @author pratikdas
|
||||
*
|
||||
*/
|
||||
public class DataStreamResourceHelper {
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @param args
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
createDataStream();
|
||||
|
||||
}
|
||||
|
||||
|
||||
public static void createDataStream() {
|
||||
KinesisClient kinesisClient = getKinesisClient();
|
||||
|
||||
CreateStreamRequest createStreamRequest = CreateStreamRequest.builder().streamName(Constants.MY_DATA_STREAM).streamModeDetails(StreamModeDetails.builder().streamMode(StreamMode.ON_DEMAND).build()).build();
|
||||
CreateStreamResponse createStreamResponse = kinesisClient.createStream(createStreamRequest);
|
||||
|
||||
DescribeStreamSummaryRequest describeStreamSummaryRequest = DescribeStreamSummaryRequest.builder().streamName(Constants.MY_DATA_STREAM ).build();
|
||||
DescribeStreamSummaryResponse describeStreamSummaryResponse = kinesisClient.describeStreamSummary(describeStreamSummaryRequest );
|
||||
|
||||
|
||||
long startTime = System.currentTimeMillis();
|
||||
long endTime = startTime + ( 10 * 60 * 1000 );
|
||||
while ( System.currentTimeMillis() < endTime ) {
|
||||
try {
|
||||
Thread.sleep(20 * 1000);
|
||||
}
|
||||
catch ( Exception e ) {}
|
||||
|
||||
try {
|
||||
StreamDescriptionSummary streamDescSumm = describeStreamSummaryResponse.streamDescriptionSummary();
|
||||
|
||||
if(streamDescSumm.streamStatus().equals(StreamStatus.ACTIVE)) break;
|
||||
try {
|
||||
Thread.sleep( 1000 );
|
||||
}catch ( Exception e ) {}
|
||||
}catch ( ResourceNotFoundException e ) {}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static KinesisClient getKinesisClient() {
|
||||
AwsCredentialsProvider credentialsProvider = ProfileCredentialsProvider.create(Constants.AWS_PROFILE_NAME);
|
||||
|
||||
KinesisClient kinesisClient = KinesisClient
|
||||
.builder()
|
||||
.credentialsProvider(credentialsProvider)
|
||||
.region(Region.US_EAST_1).build();
|
||||
return kinesisClient;
|
||||
}
|
||||
|
||||
}
|
||||
79
aws/kinesis/src/main/java/io/pratik/EventConsumer.java
Normal file
79
aws/kinesis/src/main/java/io/pratik/EventConsumer.java
Normal file
@@ -0,0 +1,79 @@
|
||||
/**
|
||||
*
|
||||
*/
|
||||
package io.pratik;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
|
||||
import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
|
||||
import software.amazon.awssdk.regions.Region;
|
||||
import software.amazon.awssdk.services.kinesis.KinesisClient;
|
||||
import software.amazon.awssdk.services.kinesis.model.GetRecordsRequest;
|
||||
import software.amazon.awssdk.services.kinesis.model.GetRecordsResponse;
|
||||
import software.amazon.awssdk.services.kinesis.model.GetShardIteratorRequest;
|
||||
import software.amazon.awssdk.services.kinesis.model.GetShardIteratorResponse;
|
||||
import software.amazon.awssdk.services.kinesis.model.Record;
|
||||
import software.amazon.awssdk.services.kinesis.model.ShardIteratorType;
|
||||
|
||||
/**
|
||||
* @author pratikdas
|
||||
*
|
||||
*/
|
||||
public class EventConsumer {
|
||||
private static final Logger logger = Logger.getLogger(EventConsumer.class.getName());
|
||||
|
||||
/**
|
||||
* @param args
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
receiveEvents();
|
||||
|
||||
}
|
||||
|
||||
public static void receiveEventsWithKCL() {}
|
||||
|
||||
|
||||
|
||||
public static void receiveEvents() {
|
||||
KinesisClient kinesisClient = getKinesisClient();
|
||||
|
||||
String shardId = "shardId-000000000001";
|
||||
|
||||
GetShardIteratorRequest getShardIteratorRequest = GetShardIteratorRequest.builder().streamName(Constants.MY_DATA_STREAM).shardId(shardId).shardIteratorType(ShardIteratorType.TRIM_HORIZON.name()).build();
|
||||
GetShardIteratorResponse getShardIteratorResponse = kinesisClient.getShardIterator(getShardIteratorRequest );
|
||||
String shardIterator = getShardIteratorResponse.shardIterator();
|
||||
logger.info("shardIterator " + shardIterator);
|
||||
|
||||
while(shardIterator != null) {
|
||||
GetRecordsRequest getRecordsRequest = GetRecordsRequest.builder().shardIterator(shardIterator).limit(5).build();
|
||||
GetRecordsResponse getRecordsResponse = kinesisClient.getRecords(getRecordsRequest );
|
||||
|
||||
|
||||
List<Record> records = getRecordsResponse.records();
|
||||
|
||||
logger.info("count "+records.size());
|
||||
records.forEach(record->{
|
||||
byte[] dataInBytes = record.data().asByteArray();
|
||||
logger.info(new String(dataInBytes));
|
||||
});
|
||||
|
||||
shardIterator = getRecordsResponse.nextShardIterator();
|
||||
}
|
||||
|
||||
kinesisClient.close();
|
||||
}
|
||||
|
||||
private static KinesisClient getKinesisClient() {
|
||||
AwsCredentialsProvider credentialsProvider = ProfileCredentialsProvider.create(Constants.AWS_PROFILE_NAME);
|
||||
|
||||
KinesisClient kinesisClient = KinesisClient
|
||||
.builder()
|
||||
.credentialsProvider(credentialsProvider)
|
||||
.region(Region.US_EAST_1)
|
||||
.build();
|
||||
return kinesisClient;
|
||||
}
|
||||
|
||||
}
|
||||
104
aws/kinesis/src/main/java/io/pratik/EventSender.java
Normal file
104
aws/kinesis/src/main/java/io/pratik/EventSender.java
Normal file
@@ -0,0 +1,104 @@
|
||||
/**
|
||||
*
|
||||
*/
|
||||
package io.pratik;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
|
||||
import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
|
||||
import software.amazon.awssdk.core.SdkBytes;
|
||||
import software.amazon.awssdk.regions.Region;
|
||||
import software.amazon.awssdk.services.kinesis.KinesisClient;
|
||||
import software.amazon.awssdk.services.kinesis.model.PutRecordRequest;
|
||||
import software.amazon.awssdk.services.kinesis.model.PutRecordResponse;
|
||||
import software.amazon.awssdk.services.kinesis.model.PutRecordsRequest;
|
||||
import software.amazon.awssdk.services.kinesis.model.PutRecordsRequestEntry;
|
||||
import software.amazon.awssdk.services.kinesis.model.PutRecordsResponse;
|
||||
|
||||
/**
|
||||
* @author pratikdas
|
||||
*
|
||||
*/
|
||||
public class EventSender {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(EventSender.class.getName());
|
||||
|
||||
/**
|
||||
* @param args
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
sendEvent();
|
||||
|
||||
}
|
||||
|
||||
public static void sendEvent() {
|
||||
KinesisClient kinesisClient = getKinesisClient();
|
||||
|
||||
String partitionKey = String.format("partitionKey-%d", 1);
|
||||
SdkBytes data = SdkBytes.fromByteBuffer(ByteBuffer.wrap("Test data".getBytes()));
|
||||
PutRecordRequest putRecordRequest
|
||||
= PutRecordRequest
|
||||
.builder()
|
||||
.streamName(Constants.MY_DATA_STREAM)
|
||||
.partitionKey(partitionKey)
|
||||
.data(data)
|
||||
.build();
|
||||
|
||||
PutRecordResponse putRecordResult
|
||||
= kinesisClient.putRecord(putRecordRequest);
|
||||
|
||||
logger.info("Put Result" + putRecordResult);
|
||||
kinesisClient.close();
|
||||
}
|
||||
|
||||
public static void sendEvents() {
|
||||
KinesisClient kinesisClient = getKinesisClient();
|
||||
|
||||
String partitionKey = String.format("partitionKey-%d", 1);
|
||||
|
||||
|
||||
List <PutRecordsRequestEntry> putRecordsRequestEntryList = new ArrayList<>();
|
||||
for (int i = 0; i < 5; i++) {
|
||||
SdkBytes data = SdkBytes
|
||||
.fromByteBuffer(ByteBuffer.wrap(("Test event "+i).getBytes()));
|
||||
|
||||
PutRecordsRequestEntry putRecordsRequestEntry
|
||||
= PutRecordsRequestEntry.builder()
|
||||
|
||||
.data(data)
|
||||
.partitionKey(partitionKey)
|
||||
.build();
|
||||
|
||||
putRecordsRequestEntryList.add(putRecordsRequestEntry);
|
||||
}
|
||||
|
||||
|
||||
PutRecordsRequest putRecordsRequest
|
||||
= PutRecordsRequest
|
||||
.builder()
|
||||
.streamName(Constants.MY_DATA_STREAM)
|
||||
.records(putRecordsRequestEntryList)
|
||||
.build();
|
||||
|
||||
PutRecordsResponse putRecordsResult = kinesisClient
|
||||
.putRecords(putRecordsRequest);
|
||||
|
||||
logger.info("Put Result" + putRecordsResult);
|
||||
kinesisClient.close();
|
||||
}
|
||||
|
||||
private static KinesisClient getKinesisClient() {
|
||||
AwsCredentialsProvider credentialsProvider = ProfileCredentialsProvider.create(Constants.AWS_PROFILE_NAME);
|
||||
|
||||
KinesisClient kinesisClient = KinesisClient
|
||||
.builder()
|
||||
.credentialsProvider(credentialsProvider)
|
||||
.region(Region.US_EAST_1).build();
|
||||
return kinesisClient;
|
||||
}
|
||||
|
||||
}
|
||||
63
aws/kinesis/src/main/java/io/pratik/FirehoseEventSender.java
Normal file
63
aws/kinesis/src/main/java/io/pratik/FirehoseEventSender.java
Normal file
@@ -0,0 +1,63 @@
|
||||
/**
|
||||
*
|
||||
*/
|
||||
package io.pratik;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
|
||||
import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
|
||||
import software.amazon.awssdk.core.SdkBytes;
|
||||
import software.amazon.awssdk.regions.Region;
|
||||
import software.amazon.awssdk.services.firehose.FirehoseClient;
|
||||
import software.amazon.awssdk.services.firehose.model.PutRecordRequest;
|
||||
import software.amazon.awssdk.services.firehose.model.PutRecordResponse;
|
||||
import software.amazon.awssdk.services.firehose.model.Record;
|
||||
|
||||
/**
|
||||
* @author pratikdas
|
||||
*
|
||||
*/
|
||||
public class FirehoseEventSender {
|
||||
private final static Logger logger = Logger.getLogger(FirehoseEventSender.class.getName());
|
||||
|
||||
/**
|
||||
* @param args
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
new FirehoseEventSender().sendEvent();
|
||||
|
||||
}
|
||||
|
||||
public void sendEvent() {
|
||||
String deliveryStreamName= "PUT-S3-5ZGgA";
|
||||
|
||||
String data = "Test data" + "\n";
|
||||
;
|
||||
Record record = Record.builder().data(SdkBytes.fromByteArray(data.getBytes())).build();
|
||||
|
||||
PutRecordRequest putRecordRequest = PutRecordRequest
|
||||
.builder()
|
||||
.deliveryStreamName(deliveryStreamName).record(record).build();
|
||||
|
||||
FirehoseClient firehoseClient = getFirehoseClient();
|
||||
// Put record into the DeliveryStream
|
||||
PutRecordResponse putRecordResponse = firehoseClient.putRecord(putRecordRequest);
|
||||
|
||||
logger.info("record ID:: " + putRecordResponse.recordId());
|
||||
firehoseClient.close();
|
||||
}
|
||||
|
||||
private static FirehoseClient getFirehoseClient() {
|
||||
AwsCredentialsProvider credentialsProvider = ProfileCredentialsProvider.create(Constants.AWS_PROFILE_NAME);
|
||||
|
||||
FirehoseClient kinesisClient = FirehoseClient
|
||||
.builder()
|
||||
.credentialsProvider(credentialsProvider)
|
||||
.region(Constants.AWS_REGION).build();
|
||||
return kinesisClient;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
/**
|
||||
*
|
||||
*/
|
||||
package io.pratik;
|
||||
|
||||
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
|
||||
import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
|
||||
import software.amazon.awssdk.regions.Region;
|
||||
import software.amazon.awssdk.services.firehose.FirehoseClient;
|
||||
import software.amazon.awssdk.services.firehose.model.CreateDeliveryStreamRequest;
|
||||
import software.amazon.awssdk.services.firehose.model.CreateDeliveryStreamResponse;
|
||||
import software.amazon.awssdk.services.firehose.model.DeliveryStreamType;
|
||||
import software.amazon.awssdk.services.firehose.model.ExtendedS3DestinationConfiguration;
|
||||
import software.amazon.awssdk.services.firehose.model.KinesisStreamSourceConfiguration;
|
||||
import software.amazon.awssdk.services.firehose.model.S3DestinationConfiguration;
|
||||
import software.amazon.awssdk.services.kinesis.KinesisClient;
|
||||
import software.amazon.awssdk.services.kinesis.model.CreateStreamRequest;
|
||||
import software.amazon.awssdk.services.kinesis.model.CreateStreamResponse;
|
||||
import software.amazon.awssdk.services.kinesis.model.DescribeStreamSummaryRequest;
|
||||
import software.amazon.awssdk.services.kinesis.model.DescribeStreamSummaryResponse;
|
||||
import software.amazon.awssdk.services.kinesis.model.ResourceNotFoundException;
|
||||
import software.amazon.awssdk.services.kinesis.model.StreamDescriptionSummary;
|
||||
import software.amazon.awssdk.services.kinesis.model.StreamMode;
|
||||
import software.amazon.awssdk.services.kinesis.model.StreamModeDetails;
|
||||
import software.amazon.awssdk.services.kinesis.model.StreamStatus;
|
||||
|
||||
/**
|
||||
* @author pratikdas
|
||||
*
|
||||
*/
|
||||
public class FirehoseResourceHelper {
|
||||
|
||||
/**
|
||||
* @param args
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
createDeliveryStream();
|
||||
|
||||
}
|
||||
|
||||
|
||||
public static void createDeliveryStream() {
|
||||
FirehoseClient firehoseClient = getFirehoseClient();
|
||||
|
||||
String kinesisStreamARN = "";
|
||||
|
||||
String roleARN = "";
|
||||
KinesisStreamSourceConfiguration kinesisStreamSourceConfiguration =
|
||||
KinesisStreamSourceConfiguration.builder().build();
|
||||
|
||||
String bucketARN = "";
|
||||
ExtendedS3DestinationConfiguration s3DestinationConfiguration
|
||||
= ExtendedS3DestinationConfiguration.builder()
|
||||
.bucketARN(bucketARN)
|
||||
.build();
|
||||
|
||||
String streamName = "";
|
||||
CreateDeliveryStreamRequest createDeliveryStreamRequest =
|
||||
CreateDeliveryStreamRequest
|
||||
.builder()
|
||||
.deliveryStreamName(streamName )
|
||||
.deliveryStreamType(DeliveryStreamType.DIRECT_PUT)
|
||||
.kinesisStreamSourceConfiguration(kinesisStreamSourceConfiguration )
|
||||
.extendedS3DestinationConfiguration(s3DestinationConfiguration )
|
||||
.build();
|
||||
CreateDeliveryStreamResponse response = firehoseClient.createDeliveryStream(createDeliveryStreamRequest );
|
||||
firehoseClient.close();
|
||||
}
|
||||
|
||||
private static FirehoseClient getFirehoseClient() {
|
||||
AwsCredentialsProvider credentialsProvider =
|
||||
ProfileCredentialsProvider.create(Constants.AWS_PROFILE_NAME);
|
||||
|
||||
FirehoseClient firehoseClient =
|
||||
FirehoseClient.builder()
|
||||
.credentialsProvider(credentialsProvider)
|
||||
.region(Region.US_EAST_1)
|
||||
.build();
|
||||
|
||||
|
||||
return firehoseClient;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
/**
|
||||
*
|
||||
*/
|
||||
package io.pratik;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.FileReader;
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
|
||||
/**
|
||||
* @author pratikdas
|
||||
*
|
||||
*/
|
||||
public class StreamingDataGenerator {
|
||||
|
||||
/**
|
||||
* @param args
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
try {
|
||||
new StreamingDataGenerator().generate();
|
||||
} catch (Exception e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void generate() throws Exception {
|
||||
File file = getFile("apache_access_log");
|
||||
|
||||
// Note: Double backquote is to avoid compiler
|
||||
// interpret words
|
||||
// like \test as \t (ie. as a escape sequence)
|
||||
|
||||
// Creating an object of BufferedReader class
|
||||
BufferedReader br
|
||||
= new BufferedReader(new FileReader(file));
|
||||
|
||||
// Declaring a string variable
|
||||
String st;
|
||||
// Condition holds true till
|
||||
// there is character in a string
|
||||
while ((st = br.readLine()) != null) {
|
||||
System.out.println(st);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private File getFile(String fileName) throws IOException
|
||||
{
|
||||
ClassLoader classLoader = getClass().getClassLoader();
|
||||
URL resource = classLoader.getResource(fileName);
|
||||
|
||||
if (resource == null) {
|
||||
throw new IllegalArgumentException("file is not found!");
|
||||
} else {
|
||||
return new File(resource.getFile());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
153
aws/kinesis/src/main/java/io/pratik/flink/ErrorCounter.java
Normal file
153
aws/kinesis/src/main/java/io/pratik/flink/ErrorCounter.java
Normal file
@@ -0,0 +1,153 @@
|
||||
package io.pratik.flink;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
import java.util.Properties;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import org.apache.flink.api.common.functions.FilterFunction;
|
||||
import org.apache.flink.api.common.functions.FlatMapFunction;
|
||||
import org.apache.flink.api.common.serialization.SimpleStringSchema;
|
||||
import org.apache.flink.streaming.api.datastream.DataStream;
|
||||
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
|
||||
import org.apache.flink.util.Collector;
|
||||
|
||||
import io.pratik.Constants;
|
||||
import io.pratik.models.LogRecord;
|
||||
import software.amazon.kinesis.connectors.flink.FlinkKinesisProducer;
|
||||
import software.amazon.kinesis.connectors.flink.config.ConsumerConfigConstants;
|
||||
|
||||
public class ErrorCounter {
|
||||
private final static Logger logger = Logger.getLogger(ErrorCounter.class.getName());
|
||||
private static final String FILE_PATH = "/Users/pratikdas/eclipse-workspace/kinesisexamples/src/main/resources/apache_access_log";
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
// set up the streaming execution environment
|
||||
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
|
||||
|
||||
DataStream<String> inputStream = createSource(env);
|
||||
|
||||
DataStream<LogRecord> logRecords = mapStringToLogRecord(inputStream);
|
||||
|
||||
DataStream<LogRecord> errorRecords = filterErrorRecords(logRecords);
|
||||
|
||||
DataStream<LogRecord> keyedStream = assignIPasKey(errorRecords);
|
||||
|
||||
|
||||
DataStream<String> keyedStreamAsText = mapLogRecordToString(keyedStream);
|
||||
|
||||
//TODO Uncomment this code for deploying to Kinesis Data Analytics
|
||||
|
||||
// keyedStream.addSink(createSink());
|
||||
|
||||
keyedStreamAsText.print();
|
||||
|
||||
env.execute("Error alerts");
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
private static DataStream<String> mapLogRecordToString(DataStream<LogRecord> keyedStream) {
|
||||
DataStream<String> keyedStreamAsText = keyedStream.flatMap(new FlatMapFunction<LogRecord, String>() {
|
||||
|
||||
@Override
|
||||
public void flatMap(LogRecord value, Collector<String> out) throws Exception {
|
||||
out.collect(value.getUrl()+"::" + value.getHttpStatus());
|
||||
}
|
||||
});
|
||||
return keyedStreamAsText;
|
||||
}
|
||||
|
||||
|
||||
|
||||
private static DataStream<LogRecord> assignIPasKey(DataStream<LogRecord> errorRecords) {
|
||||
DataStream<LogRecord> keyedStream = errorRecords.keyBy(value -> value.getIp());
|
||||
return keyedStream;
|
||||
}
|
||||
|
||||
|
||||
|
||||
private static DataStream<LogRecord> filterErrorRecords(DataStream<LogRecord> logRecords) {
|
||||
DataStream<LogRecord> errorRecords = logRecords.filter(new FilterFunction<LogRecord>() {
|
||||
|
||||
@Override
|
||||
public boolean filter(LogRecord value) throws Exception {
|
||||
boolean matched = !value.getHttpStatus().equalsIgnoreCase("200");
|
||||
|
||||
return matched;
|
||||
}
|
||||
});
|
||||
return errorRecords;
|
||||
}
|
||||
|
||||
|
||||
|
||||
private static DataStream<LogRecord> mapStringToLogRecord(DataStream<String> inputStream) {
|
||||
DataStream<LogRecord> logRecords = inputStream.flatMap(new FlatMapFunction<String, LogRecord>() {
|
||||
|
||||
@Override
|
||||
public void flatMap(String value, Collector<LogRecord> out) throws Exception {
|
||||
|
||||
String[] parts = value.split("\\s+");
|
||||
|
||||
LogRecord record = new LogRecord();
|
||||
record.setIp(parts[0]);
|
||||
record.setHttpStatus(parts[8]);
|
||||
record.setUrl(parts[6]);
|
||||
|
||||
out.collect(record);
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
return logRecords;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*private static void createSink(final StreamExecutionEnvironment env, DataStream<LogRecord> input) {
|
||||
input.print();
|
||||
}*/
|
||||
|
||||
private static DataStream<String> createSource(final StreamExecutionEnvironment env) {
|
||||
return env.readTextFile(
|
||||
FILE_PATH);
|
||||
}
|
||||
|
||||
//TODO Uncomment this code for deploying to Kinesis Data Analytics
|
||||
/*private static DataStream<String> createSource(final StreamExecutionEnvironment env) {
|
||||
Properties inputProperties = new Properties();
|
||||
inputProperties.setProperty(ConsumerConfigConstants.AWS_REGION, Constants.AWS_REGION.toString());
|
||||
inputProperties.setProperty(ConsumerConfigConstants.STREAM_INITIAL_POSITION, "LATEST");
|
||||
|
||||
String inputStreamName = "in-app-log-stream";
|
||||
return env.addSource(new FlinkKinesisConsumer<>(inputStreamName, new SimpleStringSchema(), inputProperties));
|
||||
}*/
|
||||
|
||||
private static FlinkKinesisProducer<String> createSink() {
|
||||
Properties outputProperties = new Properties();
|
||||
outputProperties.setProperty(ConsumerConfigConstants.AWS_REGION, Constants.AWS_REGION.toString());
|
||||
|
||||
FlinkKinesisProducer<String> sink = new FlinkKinesisProducer<>(new SimpleStringSchema(), outputProperties);
|
||||
String outputStreamName = "log_data_stream";
|
||||
sink.setDefaultStream(outputStreamName);
|
||||
sink.setDefaultPartition("0");
|
||||
|
||||
return sink;
|
||||
}
|
||||
|
||||
|
||||
|
||||
private File getFile(String fileName) throws IOException {
|
||||
ClassLoader classLoader = getClass().getClassLoader();
|
||||
URL resource = classLoader.getResource(fileName);
|
||||
|
||||
if (resource == null) {
|
||||
throw new IllegalArgumentException("file is not found!");
|
||||
} else {
|
||||
return new File(resource.getFile());
|
||||
}
|
||||
}
|
||||
}
|
||||
40
aws/kinesis/src/main/java/io/pratik/models/LogRecord.java
Normal file
40
aws/kinesis/src/main/java/io/pratik/models/LogRecord.java
Normal file
@@ -0,0 +1,40 @@
|
||||
/**
|
||||
*
|
||||
*/
|
||||
package io.pratik.models;
|
||||
|
||||
/**
|
||||
* @author pratikdas
|
||||
*
|
||||
*/
|
||||
public class LogRecord {
|
||||
private String ip;
|
||||
private String httpStatus;
|
||||
private String url;
|
||||
public String getIp() {
|
||||
return ip;
|
||||
}
|
||||
public void setIp(String ip) {
|
||||
this.ip = ip;
|
||||
}
|
||||
public String getHttpStatus() {
|
||||
return httpStatus;
|
||||
}
|
||||
public void setHttpStatus(String httpStatus) {
|
||||
this.httpStatus = httpStatus;
|
||||
}
|
||||
public String getUrl() {
|
||||
return url;
|
||||
}
|
||||
public void setUrl(String url) {
|
||||
this.url = url;
|
||||
}
|
||||
@Override
|
||||
public String toString() {
|
||||
return "LogRecord [ip=" + ip + ", httpStatus=" + httpStatus + ", url=" + url + "]";
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
33
aws/kinesis/src/main/resources/apache_access_log
Normal file
33
aws/kinesis/src/main/resources/apache_access_log
Normal file
@@ -0,0 +1,33 @@
|
||||
83.149.9.216 - - [17/May/2015:10:05:03 +0000] "GET /presentations/logstash-monitorama-2013/images/kibana-search.png HTTP/1.1" 200 203023 "http://semicomplete.com/presentations/logstash-monitorama-2013/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"
|
||||
83.149.9.216 - - [17/May/2015:10:05:43 +0000] "GET /presentations/logstash-monitorama-2013/images/kibana-dashboard3.png HTTP/1.1" 200 171717 "http://semicomplete.com/presentations/logstash-monitorama-2013/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"
|
||||
83.149.9.216 - - [17/May/2015:10:05:47 +0000] "GET /presentations/logstash-monitorama-2013/plugin/highlight/highlight.js HTTP/1.1" 200 26185 "http://semicomplete.com/presentations/logstash-monitorama-2013/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"
|
||||
83.149.9.216 - - [17/May/2015:10:05:12 +0000] "GET /presentations/logstash-monitorama-2013/plugin/zoom-js/zoom.js HTTP/1.1" 200 7697 "http://semicomplete.com/presentations/logstash-monitorama-2013/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"
|
||||
83.149.9.216 - - [17/May/2015:10:05:07 +0000] "GET /presentations/logstash-monitorama-2013/plugin/notes/notes.js HTTP/1.1" 200 2892 "http://semicomplete.com/presentations/logstash-monitorama-2013/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"
|
||||
83.149.9.216 - - [17/May/2015:10:05:34 +0000] "GET /presentations/logstash-monitorama-2013/images/sad-medic.png HTTP/1.1" 200 430406 "http://semicomplete.com/presentations/logstash-monitorama-2013/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"
|
||||
83.149.9.216 - - [17/May/2015:10:05:57 +0000] "GET /presentations/logstash-monitorama-2013/css/fonts/Roboto-Bold.ttf HTTP/1.1" 404 38720 "http://semicomplete.com/presentations/logstash-monitorama-2013/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"
|
||||
83.149.9.216 - - [17/May/2015:10:05:50 +0000] "GET /presentations/logstash-monitorama-2013/css/fonts/Roboto-Regular.ttf HTTP/1.1" 200 41820 "http://semicomplete.com/presentations/logstash-monitorama-2013/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"
|
||||
83.149.9.216 - - [17/May/2015:10:05:24 +0000] "GET /presentations/logstash-monitorama-2013/images/frontend-response-codes.png HTTP/1.1" 310 52878 "http://semicomplete.com/presentations/logstash-monitorama-2013/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"
|
||||
46.105.14.53 - - [17/May/2015:10:05:44 +0000] "GET /blog/tags/puppet?flav=rss20 HTTP/1.1" 200 14872 "-" "UniversalFeedParser/4.2-pre-314-svn +http://feedparser.org/"
|
||||
20.241.23.22 - - [17/May/2015:10:05:47 +0000] "GET /blog/geekery/soekris-gpio.html HTTP/1.0" 200 9587 "http://www.semicomplete.com/blog/tags/C" "Mozilla/5.0 (compatible; archive.org_bot +http://www.archive.org/details/archive.org_bot)"
|
||||
91.177.205.119 - - [17/May/2015:10:05:22 +0000] "GET /blog/geekery/xvfb-firefox.html HTTP/1.1" 200 10975 "http://en.wikipedia.org/wiki/Xvfb" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
|
||||
91.177.205.119 - - [17/May/2015:10:05:34 +0000] "GET /reset.css HTTP/1.1" 200 1015 "http://semicomplete.com/blog/geekery/xvfb-firefox.html" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
|
||||
91.177.205.119 - - [17/May/2015:10:05:37 +0000] "GET /style2.css HTTP/1.1" 200 4877 "http://semicomplete.com/blog/geekery/xvfb-firefox.html" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
|
||||
91.177.205.119 - - [17/May/2015:10:05:54 +0000] "GET /images/jordan-80.png HTTP/1.1" 200 6146 "http://semicomplete.com/blog/geekery/xvfb-firefox.html" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
|
||||
91.177.205.119 - - [17/May/2015:10:05:31 +0000] "GET /images/web/2009/banner.png HTTP/1.1" 200 52315 "http://semicomplete.com/blog/geekery/xvfb-firefox.html" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
|
||||
91.177.205.119 - - [17/May/2015:10:05:32 +0000] "GET /favicon.ico HTTP/1.1" 200 3638 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Win64; x64; Trident/6.0)"
|
||||
66.249.73.185 - - [17/May/2015:10:05:22 +0000] "GET /doc/index.html?org/elasticsearch/action/search/SearchResponse.html HTTP/1.1" 404 294 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
|
||||
207.241.237.228 - - [17/May/2015:10:05:40 +0000] "GET /blog/tags/defcon HTTP/1.0" 200 24142 "http://www.semicomplete.com/blog/tags/C" "Mozilla/5.0 (compatible; archive.org_bot +http://www.archive.org/details/archive.org_bot)"
|
||||
207.241.237.101 - - [17/May/2015:10:05:51 +0000] "GET /blog/tags/regex HTTP/1.0" 200 14888 "http://www.semicomplete.com/blog/tags/C" "Mozilla/5.0 (compatible; archive.org_bot +http://www.archive.org/details/archive.org_bot)"
|
||||
87.169.99.232 - - [17/May/2015:10:05:59 +0000] "GET /presentations/puppet-at-loggly/puppet-at-loggly.pdf.html HTTP/1.1" 200 24747 "https://www.google.de/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 Safari/537.36"
|
||||
209.85.238.199 - - [17/May/2015:10:05:30 +0000] "GET /blog/tags/firefox?flav=rss20 HTTP/1.1" 200 16021 "-" "Feedfetcher-Google; (+http://www.google.com/feedfetcher.html; 3 subscribers; feed-id=14171215010336145331)"
|
||||
209.85.238.199 - - [17/May/2015:10:05:15 +0000] "GET /test.xml HTTP/1.1" 200 1370 "-" "Feedfetcher-Google; (+http://www.google.com/feedfetcher.html; 1 subscribers; feed-id=11390274670024826467)"
|
||||
81.220.24.207 - - [17/May/2015:10:05:13 +0000] "GET /blog/geekery/ssl-latency.html HTTP/1.1" 200 17147 "http://www.google.fr/url?sa=t&rct=j&q=&esrc=s&source=web&cd=5&ved=0CE4QFjAE&url=http%3A%2F%2Fwww.semicomplete.com%2Fblog%2Fgeekery%2Fssl-latency.html&ei=ZdEAU9mGGuWX1AW09IDoBw&usg=AFQjCNHw6zioJpizqX8Q0YpKKaF4zdCSEg&bvm=bv.61535280,d.d2k" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.73.11 (KHTML, like Gecko) Version/7.0.1 Safari/537.73.11"
|
||||
81.220.24.207 - - [17/May/2015:10:05:44 +0000] "GET /reset.css HTTP/1.1" 200 1015 "http://www.semicomplete.com/blog/geekery/ssl-latency.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.73.11 (KHTML, like Gecko) Version/7.0.1 Safari/537.73.11"
|
||||
81.220.24.207 - - [17/May/2015:10:05:26 +0000] "GET /images/jordan-80.png HTTP/1.1" 200 6146 "http://www.semicomplete.com/blog/geekery/ssl-latency.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.73.11 (KHTML, like Gecko) Version/7.0.1 Safari/537.73.11"
|
||||
81.220.24.207 - - [17/May/2015:10:05:39 +0000] "GET /style2.css HTTP/1.1" 200 4877 "http://www.semicomplete.com/blog/geekery/ssl-latency.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.73.11 (KHTML, like Gecko) Version/7.0.1 Safari/537.73.11"
|
||||
81.220.24.207 - - [17/May/2015:10:05:52 +0000] "GET /images/web/2009/banner.png HTTP/1.1" 200 52315 "http://www.semicomplete.com/blog/geekery/ssl-latency.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.73.11 (KHTML, like Gecko) Version/7.0.1 Safari/537.73.11"
|
||||
81.220.24.207 - - [17/May/2015:10:05:21 +0000] "GET /favicon.ico HTTP/1.1" 200 3638 "http://www.semicomplete.com/blog/geekery/ssl-latency.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.73.11 (KHTML, like Gecko) Version/7.0.1 Safari/537.73.11"
|
||||
66.249.73.135 - - [17/May/2015:11:05:17 +0000] "GET /blog/geekery/vmware-cpu-performance.html HTTP/1.1" 200 12908 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
|
||||
46.105.14.53 - - [17/May/2015:11:05:42 +0000] "GET /blog/tags/puppet?flav=rss20 HTTP/1.1" 200 14872 "-" "UniversalFeedParser/4.2-pre-314-svn +http://feedparser.org/"
|
||||
218.30.103.62 - - [17/May/2015:11:05:11 +0000] "GET /robots.txt HTTP/1.1" 200 - "-" "Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)"
|
||||
218.30.103.62 - - [17/May/2015:11:05:46 +0000] "GET /robots.txt HTTP/1.1" 200 - "-" "Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)"
|
||||
33
aws/kinesis/src/main/resources/lambda_function/index.js
Normal file
33
aws/kinesis/src/main/resources/lambda_function/index.js
Normal file
@@ -0,0 +1,33 @@
|
||||
console.log('Loading function');
|
||||
|
||||
const validateRecord = (recordElement)=>{
|
||||
// record is considered valid if contains status field
|
||||
return recordElement.includes("status")
|
||||
}
|
||||
|
||||
exports.handler = async (event, context) => {
|
||||
/* Process the list of records and transform them */
|
||||
const output = event.records.map((record)=>{
|
||||
const decodedData = Buffer.from(record.data, "base64").toString("utf-8")
|
||||
let isValidRecord = validateRecord(decodedData)
|
||||
|
||||
if(isValidRecord){
|
||||
let parsedRecord = JSON.parse(decodedData)
|
||||
// read fields from parsed JSON for some more processing
|
||||
const outputRecord = `status::${parsedRecord.status}`
|
||||
return {
|
||||
recordId: record.recordId,
|
||||
result: 'Ok',
|
||||
// payload is encoded back to base64 before returning the result
|
||||
data: Buffer.from(outputRecord, "utf-8").toString("base64")
|
||||
}
|
||||
|
||||
}else{
|
||||
return {
|
||||
recordId: record.recordId,
|
||||
result: 'dropped',
|
||||
data: record.data // payload is kept intact,
|
||||
}
|
||||
}
|
||||
})
|
||||
};
|
||||
141
aws/s3/.gitignore
vendored
Normal file
141
aws/s3/.gitignore
vendored
Normal file
@@ -0,0 +1,141 @@
|
||||
|
||||
# Created by https://www.toptal.com/developers/gitignore/api/java,intellij+all,gradle
|
||||
# Edit at https://www.toptal.com/developers/gitignore?templates=java,intellij+all,gradle
|
||||
|
||||
### Intellij+all ###
|
||||
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
|
||||
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
||||
|
||||
# User-specific stuff
|
||||
.idea/**/workspace.xml
|
||||
.idea/**/tasks.xml
|
||||
.idea/**/usage.statistics.xml
|
||||
.idea/**/dictionaries
|
||||
.idea/**/shelf
|
||||
|
||||
# Generated files
|
||||
.idea/**/contentModel.xml
|
||||
|
||||
# Sensitive or high-churn files
|
||||
.idea/**/dataSources/
|
||||
.idea/**/dataSources.ids
|
||||
.idea/**/dataSources.local.xml
|
||||
.idea/**/sqlDataSources.xml
|
||||
.idea/**/dynamic.xml
|
||||
.idea/**/uiDesigner.xml
|
||||
.idea/**/dbnavigator.xml
|
||||
|
||||
# Gradle
|
||||
.idea/**/gradle.xml
|
||||
.idea/**/libraries
|
||||
|
||||
# Gradle and Maven with auto-import
|
||||
# When using Gradle or Maven with auto-import, you should exclude module files,
|
||||
# since they will be recreated, and may cause churn. Uncomment if using
|
||||
# auto-import.
|
||||
# .idea/artifacts
|
||||
# .idea/compiler.xml
|
||||
# .idea/jarRepositories.xml
|
||||
# .idea/modules.xml
|
||||
# .idea/*.iml
|
||||
# .idea/modules
|
||||
# *.iml
|
||||
# *.ipr
|
||||
|
||||
# CMake
|
||||
cmake-build-*/
|
||||
|
||||
# Mongo Explorer plugin
|
||||
.idea/**/mongoSettings.xml
|
||||
|
||||
# File-based project format
|
||||
*.iws
|
||||
|
||||
# IntelliJ
|
||||
# out/
|
||||
|
||||
# mpeltonen/sbt-idea plugin
|
||||
.idea_modules/
|
||||
|
||||
# JIRA plugin
|
||||
atlassian-ide-plugin.xml
|
||||
|
||||
# Cursive Clojure plugin
|
||||
.idea/replstate.xml
|
||||
|
||||
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||
com_crashlytics_export_strings.xml
|
||||
crashlytics.properties
|
||||
crashlytics-build.properties
|
||||
fabric.properties
|
||||
|
||||
# Editor-based Rest Client
|
||||
.idea/httpRequests
|
||||
|
||||
# Android studio 3.1+ serialized cache file
|
||||
.idea/caches/build_file_checksums.ser
|
||||
|
||||
### Intellij+all Patch ###
|
||||
# Ignores the whole .idea folder and all .iml files
|
||||
# See https://github.com/joeblau/gitignore.io/issues/186 and https://github.com/joeblau/gitignore.io/issues/360
|
||||
|
||||
.idea/
|
||||
|
||||
# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023
|
||||
|
||||
*.iml
|
||||
modules.xml
|
||||
.idea/misc.xml
|
||||
*.ipr
|
||||
|
||||
# Sonarlint plugin
|
||||
.idea/sonarlint
|
||||
|
||||
### Java ###
|
||||
# Compiled class file
|
||||
*.class
|
||||
|
||||
# Log file
|
||||
*.log
|
||||
|
||||
# BlueJ files
|
||||
*.ctxt
|
||||
|
||||
# Mobile Tools for Java (J2ME)
|
||||
.mtj.tmp/
|
||||
|
||||
# Package Files #
|
||||
*.jar
|
||||
*.war
|
||||
*.nar
|
||||
*.ear
|
||||
*.zip
|
||||
*.tar.gz
|
||||
*.rar
|
||||
|
||||
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||
hs_err_pid*
|
||||
|
||||
### Gradle ###
|
||||
.gradle
|
||||
build/
|
||||
|
||||
# Ignore Gradle GUI config
|
||||
gradle-app.setting
|
||||
|
||||
# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
|
||||
!gradle-wrapper.jar
|
||||
|
||||
# Cache of project
|
||||
.gradletasknamecache
|
||||
|
||||
# # Work around https://youtrack.jetbrains.com/issue/IDEA-116898
|
||||
# gradle/wrapper/gradle-wrapper.properties
|
||||
|
||||
### Gradle Patch ###
|
||||
**/build/
|
||||
|
||||
# End of https://www.toptal.com/developers/gitignore/api/java,intellij+all,gradle
|
||||
|
||||
# Dumps of the meta-db
|
||||
data/*.db
|
||||
167
aws/s3/Readme.md
Normal file
167
aws/s3/Readme.md
Normal file
@@ -0,0 +1,167 @@
|
||||
<!-- PROJECT LOGO -->
|
||||
<br />
|
||||
<p align="center">
|
||||
<img src="images/logo.png" alt="Logo" width="200" height="200">
|
||||
<h3 align="center">Private File Upload</h3>
|
||||
|
||||
<p align="center">
|
||||
Build on Spring Cloud & AWS S3
|
||||
</p>
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
<!-- TABLE OF CONTENTS -->
|
||||
## Table of Contents
|
||||
|
||||
* [About the Project](#about-the-project)
|
||||
* [Built With](#built-with)
|
||||
* [Getting Started](#getting-started)
|
||||
* [Prerequisites](#prerequisites)
|
||||
* [Installation](#installation)
|
||||
* [Usage](#usage)
|
||||
* [Contact](#contact)
|
||||
* [Acknowledgements](#acknowledgements)
|
||||
|
||||
|
||||
|
||||
<!-- ABOUT THE PROJECT -->
|
||||
## About The Project
|
||||
|
||||
<p align="center">
|
||||
<img src="images/usage.gif">
|
||||
</p>
|
||||
|
||||
|
||||
### Built With
|
||||
- Spring Boot
|
||||
- Spring Cloud
|
||||
- AWS S3
|
||||
- ☕️ & ❤️
|
||||
|
||||
<!-- GETTING STARTED -->
|
||||
## Getting Started
|
||||
|
||||
### Prerequisites
|
||||
|
||||
In order to run this application you should have an Amazon Web Services (AWS) account.
|
||||
|
||||
### Installation
|
||||
|
||||
1. Update the `application.yaml` settings value for `cloud.aws.credentials.profile-name` to the name of your local AWS-profile
|
||||
2. run `./gradlew bootRun`
|
||||
3. Open your browser at `localhost:8080`
|
||||
|
||||
<!-- USAGE EXAMPLES -->
|
||||
## Usage
|
||||
|
||||
The application wraps a lot of S3-related API calls in easy to use UI elements to
|
||||
|
||||
- create/delete buckets (mapped as "spaces" so we can give them non-unique names)
|
||||
- upload/delete files
|
||||
- make files public/private
|
||||
- create pre-signed URLs for files
|
||||
- create bucket policy rules to set the lifecycle duration for elements
|
||||
|
||||
More detailed instructions can be found here:
|
||||
|
||||
<details>
|
||||
<summary>🪣 Create a bucket</summary>
|
||||
|
||||
1. Navigate to the _Spaces_ section
|
||||
2. Click on _New Space_
|
||||
3. Enter the name and click _Submit_
|
||||
4. A message should pop up to indicate success
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>🗂 Upload a File</summary>
|
||||
|
||||
1. Navigate to the _Spaces_ section
|
||||
2. Select _Details_ on the target Space/Bucket
|
||||
3. Click on _Upload File_
|
||||
4. Pick our file, provide a name and click _Submit_
|
||||
5. A message should pop up to indicate success
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>🔎 List all Objects in a Bucket</summary>
|
||||
|
||||
1. Navigate to the _Spaces_ section
|
||||
2. Select _Details_ on the target Space/Bucket
|
||||
3. You see a list of all objects stored in the bucket
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>🌐 Get an Object's URL</summary>
|
||||
|
||||
1. Navigate to the _Spaces_ section
|
||||
2. Select _Details_ on the target Space/Bucket
|
||||
3. Select _Download_ on the target object
|
||||
4. The object's URL shall be opened in a new tab
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>📢 Make an object public</summary>
|
||||
|
||||
1. Navigate to the _Spaces_ section
|
||||
2. Select _Details_ on the target Space/Bucket
|
||||
3. Select _Make Public_ on the target object
|
||||
4. A message should pop up to indicate success
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>🤫 Make an Object private</summary>
|
||||
|
||||
1. Navigate to the _Spaces_ section
|
||||
2. Select _Details_ on the target Space/Bucket
|
||||
3. Select _Make Private_ on the target object
|
||||
4. A message should pop up to indicate success
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>🔥 Delete an Object</summary>
|
||||
|
||||
1. Navigate to the _Spaces_ section
|
||||
2. Select _Details_ on the target Space/Bucket
|
||||
3. Select _Delete_ on the target object
|
||||
4. The list of objects should reload without the deleted one
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>☄️ Delete a Bucket</summary>
|
||||
|
||||
1. Navigate to the _Spaces_ section
|
||||
2. Select _Delete_ on the target Space/Bucket
|
||||
3. The list of buckets should reload without the deleted one
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>👾 Generate a pre-signed URL</summary>
|
||||
|
||||
1. Navigate to the _Spaces_ section
|
||||
2. Select _Details_ on the target Space/Bucket
|
||||
3. Select _Magic Link_ on the target object
|
||||
4. A message should pop up, containing a pre-signed URL for that object (which is valid for 15 minutes)
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>⏳ Set Expiration on Bucket</summary>
|
||||
|
||||
1. Navigate to the _Spaces_ section
|
||||
2. Select _Make Temporary_ on the target Space/Bucket
|
||||
3. Select _Delete_ on the target object
|
||||
4. A message should pop up to indicate success
|
||||
</details>
|
||||
|
||||
<!-- CONTACT -->
|
||||
## Contact
|
||||
|
||||
Joshua Görner - [jgoerner](https://www.linkedin.com/in/jgoerner/) - joshua.goerner[at]gmail.com
|
||||
|
||||
|
||||
<!-- ACKNOWLEDGEMENTS -->
|
||||
## Acknowledgements
|
||||
* [O. Drew](https://github.com/othneildrew/Best-README-Template) - nice GH Readme template
|
||||
* [Hatchful](https://hatchful.shopify.com/) - Easy Logo Generation
|
||||
41
aws/s3/build.gradle
Normal file
41
aws/s3/build.gradle
Normal file
@@ -0,0 +1,41 @@
|
||||
plugins {
|
||||
id 'org.springframework.boot' version '2.4.2'
|
||||
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
|
||||
id 'java'
|
||||
}
|
||||
|
||||
group = 'io.jgoerner'
|
||||
version = '0.0.1-SNAPSHOT'
|
||||
sourceCompatibility = '11'
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
ext {
|
||||
// set('springCloudVersion', "Hoxton.SR9")
|
||||
set('springCloudVersion', "Finchley.SR1")
|
||||
}
|
||||
|
||||
|
||||
dependencies {
|
||||
annotationProcessor 'org.projectlombok:lombok'
|
||||
developmentOnly 'org.springframework.boot:spring-boot-devtools'
|
||||
implementation 'org.springframework.boot:spring-boot-starter-web'
|
||||
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
|
||||
implementation 'org.springframework.cloud:spring-cloud-starter-aws'
|
||||
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
|
||||
implementation 'org.projectlombok:lombok:1.18.16'
|
||||
runtimeOnly 'com.h2database:h2'
|
||||
testImplementation 'org.springframework.boot:spring-boot-starter-test'
|
||||
}
|
||||
|
||||
dependencyManagement {
|
||||
imports {
|
||||
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
|
||||
}
|
||||
}
|
||||
|
||||
test {
|
||||
useJUnitPlatform()
|
||||
}
|
||||
BIN
aws/s3/gradle/wrapper/gradle-wrapper.jar
vendored
Normal file
BIN
aws/s3/gradle/wrapper/gradle-wrapper.jar
vendored
Normal file
Binary file not shown.
6
aws/s3/gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
6
aws/s3/gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
#Mon Jan 04 22:38:53 CET 2021
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-all.zip
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
zipStorePath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
@@ -1,5 +1,21 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
#
|
||||
# Copyright 2015 the original author or authors.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# https://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
##############################################################################
|
||||
##
|
||||
## Gradle start up script for UN*X
|
||||
@@ -28,16 +44,16 @@ 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=""
|
||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD="maximum"
|
||||
|
||||
warn ( ) {
|
||||
warn () {
|
||||
echo "$*"
|
||||
}
|
||||
|
||||
die ( ) {
|
||||
die () {
|
||||
echo
|
||||
echo "$*"
|
||||
echo
|
||||
@@ -66,6 +82,7 @@ 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
|
||||
@@ -109,10 +126,11 @@ 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
|
||||
# For Cygwin or MSYS, switch paths to Windows format before running java
|
||||
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; 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
|
||||
@@ -138,35 +156,30 @@ if $cygwin ; then
|
||||
else
|
||||
eval `echo args$i`="\"$arg\""
|
||||
fi
|
||||
i=$((i+1))
|
||||
i=`expr $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" ;;
|
||||
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 ( ) {
|
||||
save () {
|
||||
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
|
||||
echo " "
|
||||
}
|
||||
APP_ARGS=$(save "$@")
|
||||
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" "$@"
|
||||
89
aws/s3/gradlew.bat
vendored
Normal file
89
aws/s3/gradlew.bat
vendored
Normal file
@@ -0,0 +1,89 @@
|
||||
@rem
|
||||
@rem Copyright 2015 the original author or authors.
|
||||
@rem
|
||||
@rem Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@rem you may not use this file except in compliance with the License.
|
||||
@rem You may obtain a copy of the License at
|
||||
@rem
|
||||
@rem https://www.apache.org/licenses/LICENSE-2.0
|
||||
@rem
|
||||
@rem Unless required by applicable law or agreed to in writing, software
|
||||
@rem distributed under the License is distributed on an "AS IS" BASIS,
|
||||
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
@rem See the License for the specific language governing permissions and
|
||||
@rem limitations under the License.
|
||||
@rem
|
||||
|
||||
@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 Resolve any "." and ".." in APP_HOME to make it shorter.
|
||||
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
|
||||
|
||||
@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="-Xmx64m" "-Xms64m"
|
||||
|
||||
@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 execute
|
||||
|
||||
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 execute
|
||||
|
||||
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
|
||||
|
||||
: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 %*
|
||||
|
||||
: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
|
||||
BIN
aws/s3/images/logo.png
Normal file
BIN
aws/s3/images/logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 60 KiB |
BIN
aws/s3/images/usage.gif
Normal file
BIN
aws/s3/images/usage.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.0 MiB |
1
aws/s3/settings.gradle
Normal file
1
aws/s3/settings.gradle
Normal file
@@ -0,0 +1 @@
|
||||
rootProject.name = 's3'
|
||||
38
aws/s3/src/main/java/io/jgoerner/s3/S3Application.java
Normal file
38
aws/s3/src/main/java/io/jgoerner/s3/S3Application.java
Normal file
@@ -0,0 +1,38 @@
|
||||
package io.jgoerner.s3;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.boot.autoconfigure.thymeleaf.ThymeleafProperties;
|
||||
import org.springframework.cloud.aws.autoconfigure.context.ContextInstanceDataAutoConfiguration;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.thymeleaf.templateresolver.FileTemplateResolver;
|
||||
import org.thymeleaf.templateresolver.ITemplateResolver;
|
||||
|
||||
@SpringBootApplication(exclude = ContextInstanceDataAutoConfiguration.class)
|
||||
public class S3Application {
|
||||
|
||||
private final ThymeleafProperties properties;
|
||||
|
||||
@Value("${spring.thymeleaf.templates_root:}")
|
||||
private String templatesRoot;
|
||||
|
||||
public S3Application(ThymeleafProperties properties) {
|
||||
this.properties = properties;
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(S3Application.class, args);
|
||||
}
|
||||
|
||||
@Bean
|
||||
public ITemplateResolver defaultTemplateResolver() {
|
||||
FileTemplateResolver resolver = new FileTemplateResolver();
|
||||
resolver.setSuffix(properties.getSuffix());
|
||||
resolver.setPrefix(templatesRoot);
|
||||
resolver.setTemplateMode(properties.getMode());
|
||||
resolver.setCacheable(properties.isCache());
|
||||
return resolver;
|
||||
}
|
||||
|
||||
}
|
||||
128
aws/s3/src/main/java/io/jgoerner/s3/adapter/in/RestApi.java
Normal file
128
aws/s3/src/main/java/io/jgoerner/s3/adapter/in/RestApi.java
Normal file
@@ -0,0 +1,128 @@
|
||||
package io.jgoerner.s3.adapter.in;
|
||||
|
||||
import io.jgoerner.s3.application.port.in.object.*;
|
||||
import io.jgoerner.s3.application.port.in.space.*;
|
||||
import io.jgoerner.s3.domain.Object;
|
||||
import io.jgoerner.s3.domain.ObjectPartial;
|
||||
import io.jgoerner.s3.domain.Space;
|
||||
import io.jgoerner.s3.domain.SpacePartial;
|
||||
import lombok.SneakyThrows;
|
||||
import lombok.extern.log4j.Log4j2;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.net.URL;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("api")
|
||||
@Log4j2
|
||||
public class RestApi {
|
||||
|
||||
private final CreateSpace spaceCreator;
|
||||
private final GetAllSpaces allSpaceGetter;
|
||||
private final RemoveSpace spaceRemover;
|
||||
private final GetAllObjects allObjectsInSpaceGetter;
|
||||
private final UploadObject objectUploader;
|
||||
private final UpdateObject objectUpdater;
|
||||
private final RemoveObject objectDeleter;
|
||||
private final ForceRemoveSpace forceSpaceRemover;
|
||||
private final CreateLink linkCreator;
|
||||
private final SetTTL ttlUpdater;
|
||||
private final RemoveTTL ttlRemover;
|
||||
|
||||
public RestApi(
|
||||
CreateSpace spaceCreator,
|
||||
GetAllSpaces allSpaceGetter,
|
||||
RemoveSpace spaceRemover,
|
||||
GetAllObjects allObjectsInSpaceGetter,
|
||||
UploadObject objectUploader,
|
||||
UpdateObject objectUpdater,
|
||||
RemoveObject objectDeleter,
|
||||
ForceRemoveSpace forceSpaceRemover,
|
||||
CreateLink linkCreator,
|
||||
SetTTL ttlUpdater,
|
||||
RemoveTTL ttlRemover) {
|
||||
this.spaceCreator = spaceCreator;
|
||||
this.allSpaceGetter = allSpaceGetter;
|
||||
this.spaceRemover = spaceRemover;
|
||||
this.allObjectsInSpaceGetter = allObjectsInSpaceGetter;
|
||||
this.objectUploader = objectUploader;
|
||||
this.objectUpdater = objectUpdater;
|
||||
this.objectDeleter = objectDeleter;
|
||||
this.forceSpaceRemover = forceSpaceRemover;
|
||||
this.linkCreator = linkCreator;
|
||||
this.ttlUpdater = ttlUpdater;
|
||||
this.ttlRemover = ttlRemover;
|
||||
}
|
||||
|
||||
@GetMapping("/space")
|
||||
List<Space> getSpaces() {
|
||||
return allSpaceGetter.getAll();
|
||||
}
|
||||
|
||||
@PostMapping("/space/{space}")
|
||||
Space postSpace(@PathVariable String space) {
|
||||
return spaceCreator.create(space);
|
||||
}
|
||||
|
||||
@DeleteMapping("/space/{space}")
|
||||
void deleteSpace(@PathVariable String space, @RequestParam Optional<Boolean> force) {
|
||||
log.info("Got the value " + force);
|
||||
force.ifPresentOrElse(
|
||||
value -> {
|
||||
if (value) {
|
||||
forceSpaceRemover.forceRemove(space);
|
||||
} else {
|
||||
spaceRemover.remove(space);
|
||||
}
|
||||
},
|
||||
() -> spaceRemover.remove(space));
|
||||
}
|
||||
|
||||
@GetMapping("/space/{space}/object")
|
||||
List<Object> getObjectsInSpace(@PathVariable String space) {
|
||||
return allObjectsInSpaceGetter.getAllObjects(space);
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
@PostMapping("/space/{space}/object")
|
||||
Object postObject(
|
||||
@PathVariable String space,
|
||||
@RequestParam("file") MultipartFile file,
|
||||
@RequestParam(required = false, name = "name") String name) {
|
||||
var key = name != null ? name : file.getOriginalFilename();
|
||||
return objectUploader.upload(space, key, file.getInputStream());
|
||||
}
|
||||
|
||||
@PatchMapping("/space/{space}/object/{key}")
|
||||
Object patchObject(
|
||||
@PathVariable String space, @PathVariable String key, @RequestBody ObjectPartial body) {
|
||||
log.info("Got the partial " + body);
|
||||
return objectUpdater.update(space, key, body);
|
||||
}
|
||||
|
||||
@DeleteMapping("/space/{space}/object/{key}")
|
||||
void deleteObject(@PathVariable String space, @PathVariable String key) {
|
||||
objectDeleter.delete(space, key);
|
||||
}
|
||||
|
||||
@PostMapping("/space/{space}/object/{key}/url")
|
||||
URL createLink(
|
||||
@PathVariable String space,
|
||||
@PathVariable String key,
|
||||
@RequestParam(required = false, name = "duration", defaultValue = "300") Long duration) {
|
||||
return linkCreator.createLink(space, key, duration);
|
||||
}
|
||||
|
||||
@PatchMapping("/space/{space}")
|
||||
void patchSpace(@PathVariable String space, @RequestBody(required = false) SpacePartial body) {
|
||||
log.info("got " + body);
|
||||
if (body.getTtlInDays() > 1) {
|
||||
ttlUpdater.setTTL(space, body.getTtlInDays());
|
||||
} else {
|
||||
ttlRemover.removeTTL(space);
|
||||
}
|
||||
}
|
||||
}
|
||||
126
aws/s3/src/main/java/io/jgoerner/s3/adapter/in/View.java
Normal file
126
aws/s3/src/main/java/io/jgoerner/s3/adapter/in/View.java
Normal file
@@ -0,0 +1,126 @@
|
||||
package io.jgoerner.s3.adapter.in;
|
||||
|
||||
import io.jgoerner.s3.domain.ObjectPartial;
|
||||
import io.jgoerner.s3.domain.SpacePartial;
|
||||
import lombok.Data;
|
||||
import lombok.extern.log4j.Log4j2;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.ui.Model;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
||||
@Log4j2
|
||||
@Controller()
|
||||
public class View {
|
||||
|
||||
private final RestApi api;
|
||||
|
||||
public View(RestApi api) {
|
||||
this.api = api;
|
||||
}
|
||||
|
||||
@GetMapping("space")
|
||||
String space(Model model) {
|
||||
var spaces = api.getSpaces();
|
||||
model.addAttribute("spaces", spaces);
|
||||
return "space-overview";
|
||||
}
|
||||
|
||||
@GetMapping("space/{name}")
|
||||
String spaceDetail(@PathVariable String name, Model model) {
|
||||
model.addAllAttributes(Map.of("space", name, "objects", api.getObjectsInSpace(name)));
|
||||
return "space-detail";
|
||||
}
|
||||
|
||||
@GetMapping("space/{space}/make-public/{key}")
|
||||
String makePublic(
|
||||
@PathVariable String space, @PathVariable String key, RedirectAttributes redirectAttributes) {
|
||||
api.patchObject(space, key, new ObjectPartial(true));
|
||||
redirectAttributes.addFlashAttribute("success", "Made object public");
|
||||
return "redirect:/space/" + space;
|
||||
}
|
||||
|
||||
@GetMapping("space/{space}/make-private/{key}")
|
||||
String makePrivate(
|
||||
@PathVariable String space, @PathVariable String key, RedirectAttributes redirectAttributes) {
|
||||
api.patchObject(space, key, new ObjectPartial(false));
|
||||
redirectAttributes.addFlashAttribute("success", "Made object private");
|
||||
return "redirect:/space/" + space;
|
||||
}
|
||||
|
||||
@GetMapping("space/{space}/delete/{key}")
|
||||
String deleteObject(@PathVariable String space, @PathVariable String key) {
|
||||
api.deleteObject(space, key);
|
||||
return "redirect:/space/" + space;
|
||||
}
|
||||
|
||||
@GetMapping("/space/{space}/object-form")
|
||||
String objectNew(@PathVariable String space, Model model) {
|
||||
model.addAllAttributes(Map.of("space", space, "object", new ObjectForm()));
|
||||
return "object-form";
|
||||
}
|
||||
|
||||
@PostMapping("/space/{space}/object-form")
|
||||
String postObject(
|
||||
@PathVariable String space,
|
||||
@RequestParam("file") MultipartFile file,
|
||||
@ModelAttribute ObjectForm form,
|
||||
RedirectAttributes redirectAttributes) {
|
||||
api.postObject(space, file, form.getName());
|
||||
redirectAttributes.addFlashAttribute("success", "Successfully uploaded " + form.getName());
|
||||
return "redirect:/space/" + space;
|
||||
}
|
||||
|
||||
@GetMapping("/space/{space}/magic/{key}")
|
||||
String magicLink(
|
||||
@PathVariable String space, @PathVariable String key, RedirectAttributes redirectAttributes) {
|
||||
var link = api.createLink(space, key, 15L);
|
||||
redirectAttributes.addFlashAttribute("warn", link);
|
||||
return "redirect:/space/" + space;
|
||||
}
|
||||
|
||||
@GetMapping("space-form")
|
||||
String spaceNew(Model model) {
|
||||
model.addAttribute("space", new SpaceForm());
|
||||
return "space-form";
|
||||
}
|
||||
|
||||
@PostMapping("space-form")
|
||||
String newSpace(@ModelAttribute SpaceForm form, RedirectAttributes redirectAttributes) {
|
||||
api.postSpace(form.getName());
|
||||
redirectAttributes.addFlashAttribute("success", "Successfully created " + form.getName());
|
||||
return "redirect:space";
|
||||
}
|
||||
|
||||
@GetMapping("space/temporary/{name}")
|
||||
String makeTemporary(@PathVariable String name) {
|
||||
api.patchSpace(name, new SpacePartial(2));
|
||||
return "redirect:/space";
|
||||
}
|
||||
|
||||
@GetMapping("space/permanent/{name}")
|
||||
String makePermanent(@PathVariable String name) {
|
||||
api.patchSpace(name, new SpacePartial(-1));
|
||||
return "redirect:/space";
|
||||
}
|
||||
|
||||
@GetMapping("space/delete/{name}")
|
||||
String delete(@PathVariable String name) {
|
||||
api.deleteSpace(name, Optional.of(true));
|
||||
return "redirect:/space";
|
||||
}
|
||||
}
|
||||
|
||||
@Data
|
||||
class SpaceForm {
|
||||
String name;
|
||||
}
|
||||
|
||||
@Data
|
||||
class ObjectForm {
|
||||
String name;
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package io.jgoerner.s3.adapter.out.h2;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.Id;
|
||||
|
||||
@Entity
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
@Setter
|
||||
public class SpaceEntity {
|
||||
@Id private String name;
|
||||
private String bucket;
|
||||
private Integer ttl;
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
package io.jgoerner.s3.adapter.out.h2;
|
||||
|
||||
import io.jgoerner.s3.application.port.out.space.*;
|
||||
import io.jgoerner.s3.domain.Space;
|
||||
import lombok.extern.log4j.Log4j2;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Component
|
||||
@Log4j2
|
||||
public class SpacePersistenceHandler
|
||||
implements CheckSpaceExistence,
|
||||
SaveSpace,
|
||||
RetrieveAllSpaces,
|
||||
ResolveSpaceName,
|
||||
DeleteSpace,
|
||||
RetrieveSpaceByName {
|
||||
|
||||
private final SpaceRepository spaceRepository;
|
||||
|
||||
public SpacePersistenceHandler(SpaceRepository spaceRepository) {
|
||||
this.spaceRepository = spaceRepository;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean doesExist(String name) {
|
||||
return this.spaceRepository.findById(name).isPresent();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Space save(Space name) {
|
||||
this.spaceRepository.save(SpacePersistenceHandler.mapPojoToJpa(name));
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Space> findAll() {
|
||||
return spaceRepository.findAll().stream()
|
||||
.map(SpacePersistenceHandler::mapJpaToPojo)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private static SpaceEntity mapPojoToJpa(Space space) {
|
||||
return new SpaceEntity(space.getName(), space.getBucket(), space.getTtl());
|
||||
}
|
||||
|
||||
private static Space mapJpaToPojo(SpaceEntity entity) {
|
||||
return new Space(entity.getName(), entity.getBucket(), entity.getTtl());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String resolve(String name) {
|
||||
var bucket = spaceRepository.findById(name).get().getBucket();
|
||||
log.info("Space " + name + " was resolved to " + bucket);
|
||||
return bucket;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delete(String name) {
|
||||
spaceRepository.deleteById(name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Space retrieveByName(String name) {
|
||||
return mapJpaToPojo(spaceRepository.findById(name).orElseThrow());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package io.jgoerner.s3.adapter.out.h2;
|
||||
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
@Repository
|
||||
public interface SpaceRepository extends JpaRepository<SpaceEntity, String> {}
|
||||
@@ -0,0 +1,143 @@
|
||||
package io.jgoerner.s3.adapter.out.s3;
|
||||
|
||||
import com.amazonaws.services.s3.AmazonS3Client;
|
||||
import com.amazonaws.services.s3.model.*;
|
||||
import com.amazonaws.services.s3.model.lifecycle.LifecycleFilter;
|
||||
import com.amazonaws.waiters.WaiterParameters;
|
||||
import io.jgoerner.s3.application.port.out.bucket.*;
|
||||
import io.jgoerner.s3.application.port.out.object.*;
|
||||
import io.jgoerner.s3.domain.Object;
|
||||
import lombok.extern.log4j.Log4j2;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.net.URL;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Repository
|
||||
@Log4j2
|
||||
public class S3Repository
|
||||
implements CreateBucket,
|
||||
DeleteBucket,
|
||||
ListObjects,
|
||||
SaveObject,
|
||||
MakeObjectPublic,
|
||||
MakeObjectPrivate,
|
||||
DeleteObject,
|
||||
CreatePresignedUrl,
|
||||
SetVisibilityInObjectLifecycle,
|
||||
RemoveVisibilityInObjectLifecycle {
|
||||
|
||||
private final AmazonS3Client s3Client;
|
||||
|
||||
public S3Repository(AmazonS3Client s3Client) {
|
||||
this.s3Client = s3Client;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void create(String bucket) {
|
||||
// send bucket creation request
|
||||
s3Client.createBucket(bucket);
|
||||
log.info("Request to create " + bucket + " sent");
|
||||
|
||||
// assure that bucket is available
|
||||
s3Client.waiters().bucketExists().run(new WaiterParameters<>(new HeadBucketRequest(bucket)));
|
||||
log.info("Bucket " + bucket + " is ready");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delete(String bucket) {
|
||||
// send deletion request
|
||||
s3Client.deleteBucket(bucket);
|
||||
log.info("Request to delete " + bucket + " sent");
|
||||
|
||||
// assure bucket is deleted
|
||||
s3Client.waiters().bucketNotExists().run(new WaiterParameters(new HeadBucketRequest(bucket)));
|
||||
log.info("Bucket " + bucket + " is deleted");
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Object> listObjectsInBucket(String bucket) {
|
||||
var items =
|
||||
s3Client.listObjectsV2(bucket).getObjectSummaries().stream()
|
||||
.parallel()
|
||||
.map(S3ObjectSummary::getKey)
|
||||
.map(key -> mapS3ToObject(bucket, key))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
log.info("Found " + items.size() + " objects in the bucket " + bucket);
|
||||
return items;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object safe(String bucket, String key, String name, InputStream payload) {
|
||||
var metadata = new ObjectMetadata();
|
||||
metadata.addUserMetadata("name", name);
|
||||
s3Client.putObject(bucket, key, payload, metadata);
|
||||
log.info("Sent the request");
|
||||
return Object.builder().name(name).key(key).url(s3Client.getUrl(bucket, key)).build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void makePublic(String bucket, String key) {
|
||||
s3Client.setObjectAcl(bucket, key, CannedAccessControlList.PublicRead);
|
||||
log.info("Sent request to make object in bucket " + bucket + " with key " + key + " public");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void makePrivate(String bucket, String key) {
|
||||
s3Client.setObjectAcl(bucket, key, CannedAccessControlList.BucketOwnerFullControl);
|
||||
log.info("Sent request to make object in bucket " + bucket + " with key " + key + " private");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delete(String bucket, String key) {
|
||||
s3Client.deleteObject(bucket, key);
|
||||
log.info("Sent request to delete file with key " + key + " in bucket " + bucket);
|
||||
}
|
||||
|
||||
@Override
|
||||
public URL createURL(String bucket, String key, Long duration) {
|
||||
var date = new Date(new Date().getTime() + duration * 1000); // 1 s * 1000 ms/s
|
||||
var url = s3Client.generatePresignedUrl(bucket, key, date);
|
||||
log.info("Generated the signature " + url);
|
||||
return url;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setVisibility(String bucket, Integer ttlInDays) {
|
||||
s3Client.setBucketLifecycleConfiguration(
|
||||
bucket,
|
||||
new BucketLifecycleConfiguration()
|
||||
.withRules(
|
||||
new BucketLifecycleConfiguration.Rule()
|
||||
.withId("custom-expiration-id")
|
||||
.withFilter(new LifecycleFilter())
|
||||
.withStatus(BucketLifecycleConfiguration.ENABLED)
|
||||
.withExpirationInDays(ttlInDays)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeVisibility(String bucket) {
|
||||
s3Client.deleteBucketLifecycleConfiguration(bucket);
|
||||
}
|
||||
|
||||
private Object mapS3ToObject(String bucket, String key) {
|
||||
|
||||
return Object.builder()
|
||||
.name(s3Client.getObjectMetadata(bucket, key).getUserMetaDataOf("name"))
|
||||
.key(key)
|
||||
.url(s3Client.getUrl(bucket, key))
|
||||
.isPublic(
|
||||
s3Client.getObjectAcl(bucket, key).getGrantsAsList().stream()
|
||||
.anyMatch(grant -> grant.equals(S3Repository.publicObjectReadGrant())))
|
||||
.build();
|
||||
}
|
||||
|
||||
private static Grant publicObjectReadGrant() {
|
||||
return new Grant(
|
||||
GroupGrantee.parseGroupGrantee(GroupGrantee.AllUsers.getIdentifier()), Permission.Read);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package io.jgoerner.s3.application.port.in.object;
|
||||
|
||||
import java.net.URL;
|
||||
|
||||
public interface CreateLink {
|
||||
URL createLink(String space, String key, Long duration);
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package io.jgoerner.s3.application.port.in.object;
|
||||
|
||||
import io.jgoerner.s3.domain.Object;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface GetAllObjects {
|
||||
List<Object> getAllObjects(String space);
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package io.jgoerner.s3.application.port.in.object;
|
||||
|
||||
public interface RemoveObject {
|
||||
void delete(String space, String key);
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package io.jgoerner.s3.application.port.in.object;
|
||||
|
||||
import io.jgoerner.s3.domain.ObjectPartial;
|
||||
import io.jgoerner.s3.domain.Object;
|
||||
|
||||
public interface UpdateObject {
|
||||
Object update(String space, String key, ObjectPartial updates);
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package io.jgoerner.s3.application.port.in.object;
|
||||
|
||||
import io.jgoerner.s3.domain.Object;
|
||||
|
||||
import java.io.InputStream;
|
||||
|
||||
public interface UploadObject {
|
||||
Object upload(String space, String name, InputStream payload);
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package io.jgoerner.s3.application.port.in.space;
|
||||
|
||||
import io.jgoerner.s3.domain.Space;
|
||||
|
||||
public interface CreateSpace {
|
||||
Space create(String name);
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package io.jgoerner.s3.application.port.in.space;
|
||||
|
||||
public interface ForceRemoveSpace {
|
||||
void forceRemove(String space);
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package io.jgoerner.s3.application.port.in.space;
|
||||
|
||||
import io.jgoerner.s3.domain.Space;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface GetAllSpaces {
|
||||
List<Space> getAll();
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package io.jgoerner.s3.application.port.in.space;
|
||||
|
||||
public interface RemoveSpace {
|
||||
void remove(String space);
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package io.jgoerner.s3.application.port.in.space;
|
||||
|
||||
public interface RemoveTTL {
|
||||
void removeTTL(String space);
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package io.jgoerner.s3.application.port.in.space;
|
||||
|
||||
public interface SetTTL {
|
||||
void setTTL(String space, Integer ttlInDays);
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package io.jgoerner.s3.application.port.out.bucket;
|
||||
|
||||
public interface CreateBucket {
|
||||
void create(String bucket);
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package io.jgoerner.s3.application.port.out.bucket;
|
||||
|
||||
public interface DeleteBucket {
|
||||
void delete(String bucket);
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package io.jgoerner.s3.application.port.out.bucket;
|
||||
|
||||
import io.jgoerner.s3.domain.Object;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface ListObjects {
|
||||
List<Object> listObjectsInBucket(String bucket);
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package io.jgoerner.s3.application.port.out.bucket;
|
||||
|
||||
public interface RemoveVisibilityInObjectLifecycle {
|
||||
void removeVisibility(String bucket);
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package io.jgoerner.s3.application.port.out.bucket;
|
||||
|
||||
public interface SetVisibilityInObjectLifecycle {
|
||||
void setVisibility(String bucket, Integer ttlInDays);
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package io.jgoerner.s3.application.port.out.object;
|
||||
|
||||
import java.net.URL;
|
||||
|
||||
public interface CreatePresignedUrl {
|
||||
URL createURL(String bucket, String key, Long duration);
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package io.jgoerner.s3.application.port.out.object;
|
||||
|
||||
public interface DeleteObject {
|
||||
void delete(String bucket, String key);
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package io.jgoerner.s3.application.port.out.object;
|
||||
|
||||
public interface MakeObjectPrivate {
|
||||
void makePrivate(String bucket, String key);
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package io.jgoerner.s3.application.port.out.object;
|
||||
|
||||
public interface MakeObjectPublic {
|
||||
void makePublic(String bucket, String key);
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package io.jgoerner.s3.application.port.out.object;
|
||||
|
||||
import io.jgoerner.s3.domain.Object;
|
||||
|
||||
import java.io.InputStream;
|
||||
|
||||
public interface SaveObject {
|
||||
Object safe(String bucket, String key, String name, InputStream payload);
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package io.jgoerner.s3.application.port.out.space;
|
||||
|
||||
public interface CheckSpaceExistence {
|
||||
boolean doesExist(String name);
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package io.jgoerner.s3.application.port.out.space;
|
||||
|
||||
public interface DeleteSpace {
|
||||
void delete(String name);
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package io.jgoerner.s3.application.port.out.space;
|
||||
|
||||
public interface ResolveSpaceName {
|
||||
String resolve(String name);
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package io.jgoerner.s3.application.port.out.space;
|
||||
|
||||
import io.jgoerner.s3.domain.Space;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface RetrieveAllSpaces {
|
||||
List<Space> findAll();
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user