Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

added local type #77

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/resources/instance.md
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ Optional:
- `bootstrap` (Attributes) Script executed once upon instance connection, often for mounting on VM data volumes from attached disks (e.g., AWS EBS, Azure Disk Storage). This script runs only once, even during instance recreation, as changes are typically persistent and system-wide. If re-execution is needed, it is recommended to set up a new machine. (see [below for nested schema](#nestedatt--system--bootstrap))
- `data_dir` (String) Remote root path in which AEM Compose files and unpacked AEM instances will be stored.
- `env` (Map of String) Environment variables for AEM instances.
- `service_enabled` (Boolean) Enabled the AEM system service (systemd).
- `service_config` (String) Contents of the AEM system service definition file (systemd).
- `user` (String) System user under which AEM instance will be running. By default, the same as the user used to connect to the machine.
- `work_dir` (String) Remote root path where provider-related files will be stored.
Expand Down
24 changes: 12 additions & 12 deletions examples/aws_ssm/aws.tf
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ resource "aws_instance" "aem_single" {
instance_type = "m5.xlarge"
iam_instance_profile = aws_iam_instance_profile.aem_ec2.name
tags = local.tags
user_data = trimspace(<<EOF
user_data = trimspace(<<EOF
#!/bin/bash
sudo dnf install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
EOF
EOF
)
}

Expand All @@ -30,17 +30,17 @@ resource "aws_iam_instance_profile" "aem_ec2" {
}

resource "aws_iam_role" "aem_ec2" {
name = "${local.workspace}_aem_ec2"
name = "${local.workspace}_aem_ec2"
assume_role_policy = trimspace(<<EOF
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Principal": {"Service": "ec2.amazonaws.com"},
"Action": "sts:AssumeRole"
}
}
EOF
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Principal": {"Service": "ec2.amazonaws.com"},
"Action": "sts:AssumeRole"
}
}
EOF
)
tags = local.tags
}
Expand Down
47 changes: 47 additions & 0 deletions examples/local/aem.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
resource "aem_instance" "single" {
client {
type = "local"
settings = {
}
}

system {
data_dir = local.compose_dir
work_dir = local.work_dir
service_enabled = false
bootstrap = {
inline = [
]
}
}

compose {
config = file("aem.yml")
create = {
inline = [
"mkdir -p ${local.compose_dir}/aem/home/lib",
"cp ${local.library_dir}/* ${local.compose_dir}/aem/home/lib",
"sh aemw instance init",
"sh aemw instance create",
]
}
configure = {
inline = [
"sh aemw osgi config save --pid 'org.apache.sling.jcr.davex.impl.servlets.SlingDavExServlet' --input-string 'alias: /crx/server'",
"sh aemw repl agent setup -A --location 'author' --name 'publish' --input-string '{enabled: true, transportUri: \"http://localhost:4503/bin/receive?sling:authRequestLogin=1\", transportUser: admin, transportPassword: admin, userId: admin}'",
]
}
}
}

locals {
env = "local"
data_dir = "~/data/${local.env}"
compose_dir = "${local.data_dir}/aemc"
work_dir = "~/tmp/${local.env}/aemc"
library_dir = "~/lib"
}

output "aem_instances" {
value = "127.0.0.1"
}
258 changes: 258 additions & 0 deletions examples/local/aem.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,258 @@
# AEM instances to work with
instance:

# Full details of local or remote instances
config:
local_author:
active: true
http_url: http://127.0.0.1:6502
user: admin
password: admin
run_modes: [local]
jvm_opts:
- -server
- -Djava.awt.headless=true
- -Djava.io.tmpdir=[[canonicalPath .Path "aem/home/tmp"]]
- -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:16502
- -Duser.language=en
- -Duser.country=US
- -Duser.timezone=UTC
start_opts: []
secret_vars:
- ACME_SECRET=value
env_vars:
- ACME_VAR=value
sling_props: []
local_publish:
active: true
http_url: http://127.0.0.1:6503
user: admin
password: admin
run_modes: [local]
jvm_opts:
- -server
- -Djava.awt.headless=true
- -Djava.io.tmpdir=[[canonicalPath .Path "aem/home/tmp"]]
- -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:16503
- -Duser.language=en
- -Duser.country=US
- -Duser.timezone=UTC
start_opts: []
secret_vars:
- ACME_SECRET=value
env_vars:
- ACME_VAR=value
sling_props: []

# Tuning performance & reliability
# 'auto' - for more than 1 local instances - 'serial', otherwise 'parallel'
# 'parallel' - for working with remote instances
# 'serial' - for working with local instances
processing_mode: auto

# HTTP client settings
http:
timeout: 10m
debug: false
disable_warn: true

# State checking
check:
# Time to wait before first state checking (to avoid false-positives)
warmup: 1s
# Time to wait for next state checking
interval: 6s
# Number of successful check attempts that indicates end of checking
done_threshold: 3
# Wait only for those instances whose state has been changed internally (unaware of external changes)
await_strict: true
# Max time to wait for the instance to be healthy after executing the start script or e.g deploying a package
await_started:
timeout: 30m
# Max time to wait for the instance to be stopped after executing the stop script
await_stopped:
timeout: 10m
# Max time in which socket connection to instance should be established
reachable:
skip: false
timeout: 3s
# Bundle state tracking
bundle_stable:
skip: false
symbolic_names_ignored: []
# OSGi events tracking
event_stable:
skip: false
# Topics indicating that instance is not stable
topics_unstable:
- "org/osgi/framework/ServiceEvent/*"
- "org/osgi/framework/FrameworkEvent/*"
- "org/osgi/framework/BundleEvent/*"
# Ignored service names to handle known issues
details_ignored:
- "*.*MBean"
- "org.osgi.service.component.runtime.ServiceComponentRuntime"
- "java.util.ResourceBundle"
received_max_age: 5s
# OSGi components state tracking
component_stable:
skip: false
pids:
include: ['com.day.crx.packaging.*', 'org.apache.sling.installer.*']
exclude: ['org.apache.sling.installer.hc.*', 'org.apache.sling.installer.core.impl.console.*']
match:
"disabled": []
"no config": []
"unsatisfied (reference)": []
"satisfied": []
# Sling Installer tracking
installer:
skip: false
# JMX state checking
state: true
# Pause Installation nodes checking
pause: true
# Specific endpoints / paths (like login page)
path_ready:
timeout: 10s
login_page:
skip: false
path: "/libs/granite/core/content/login.html"
status_code: 200
contained_text: QUICKSTART_HOMEPAGE

# Managed locally (set up automatically)
local:
# Current runtime dir (Sling launchpad, JCR repository)
unpack_dir: "aem/home/var/instance"
# Archived runtime dir (AEM backup files '*.aemb.zst')
backup_dir: "aem/home/var/backup"

# Oak Run tool options (offline instance management)
oak_run:
download_url: "https://repo1.maven.org/maven2/org/apache/jackrabbit/oak-run/1.44.0/oak-run-1.44.0.jar"
store_path: "crx-quickstart/repository/segmentstore"

# Source files
quickstart:
# AEM SDK ZIP or JAR
dist_file: 'aem/home/lib/{aem-sdk,cq-quickstart}-*.{zip,jar}'
# AEM License properties file
license_file: "aem/home/lib/license.properties"

# Status discovery (timezone, AEM version, etc)
status:
timeout: 500ms

# JCR Repository
repo:
property_change_ignored:
# AEM assigns them automatically
- "jcr:created"
- "cq:lastModified"
# AEM encrypts it right after changing by replication agent setup command
- "transportPassword"

# CRX Package Manager
package:
# Force re-uploading/installing of snapshot AEM packages (just built / unreleased)
snapshot_patterns: [ "**/*-SNAPSHOT.zip" ]
snapshot_ignored: false
# Use checksums to avoid re-deployments when snapshot AEM packages are unchanged
snapshot_deploy_skipping: true
# Disable following workflow launchers for a package deployment time only
toggled_workflows: [/libs/settings/workflow/launcher/config/update_asset_*,/libs/settings/workflow/launcher/config/dam_*]
# Also sub-packages
install_recursive: true
# Use slower HTML endpoint for deployments but with better troubleshooting
install_html:
enabled: false
# Print HTML directly to console instead of writing to file
console: false
# Fail on case 'installed with errors'
strict: true
# Number of changes after which the commit to the repository is performed
install_save_threshold: 1024
# Allows to relax dependency handling if needed
install_dependency_handling: required
# Controls how 'rep:policy' nodes are handled during import
install_ac_handling: ''

# 'SSL By Default'
ssl:
setup_timeout: 30s

# OSGi Framework
osgi:
shutdown_delay: 3s

bundle:
install:
start: true
start_level: 20
refresh_packages: true

# Crypto Support
crypto:
key_bundle_symbolic_name: com.adobe.granite.crypto.file

# Replication
replication:
bundle_symbolic_name: com.day.cq.cq-replication

# Workflow Manager
workflow:
launcher:
lib_root: /libs/settings/workflow/launcher
config_root: /conf/global/settings/workflow/launcher
toggle_retry:
timeout: 10m
delay: 10s

java:
# Require following versions before e.g running AEM instances
version_constraints: ">= 11, < 12"

# Pre-installed local JDK dir
# a) keep it empty to download open source Java automatically for current OS and architecture
# b) set it to absolute path or to env var '[[.Env.JAVA_HOME]]' to indicate where closed source Java like Oracle is installed
home_dir: ""

# Auto-installed JDK options
download:
# Source URL with template vars support
url: "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.18%2B10/OpenJDK11U-jdk_[[.Arch]]_[[.Os]]_hotspot_11.0.18_10.[[.ArchiveExt]]"
# Map source URL template vars to be compatible with Adoptium Java
replacements:
# Var 'Os' (GOOS)
"darwin": "mac"
# Var 'Arch' (GOARCH)
"x86_64": "x64"
"amd64": "x64"
"386": "x86-32"
# enforce non-ARM Java as some AEM features are not working on ARM (e.g Scene7)
"arm64": "x64"
"aarch64": "x64"

base:
# Location of temporary files (downloaded AEM packages, etc)
tmp_dir: aem/home/tmp
# Location of supportive tools (downloaded Java, OakRun, unpacked AEM SDK)
tool_dir: aem/home/opt

log:
level: info
timestamp_format: "2006-01-02 15:04:05"
full_timestamp: true

input:
format: yml
file: STDIN

output:
format: text
log:
# File path of logs written especially when output format is different than 'text'
file: aem/home/var/log/aem.log
# Controls where outputs and logs should be written to when format is 'text' (console|file|both)
mode: both
10 changes: 10 additions & 0 deletions examples/local/main.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
terraform {
required_providers {
aem = {
source = "registry.terraform.io/wttech/aem"
version = "< 2.0.0"
}
}
}

provider "aem" {}
2 changes: 2 additions & 0 deletions internal/client/client_manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ func (c ClientManager) connection(typeName string, settings map[string]string) (
commandWaitMin: cast.ToDuration(settings["command_wait_min"]),
commandWaitMax: cast.ToDuration(settings["command_wait_max"]),
}, nil
case "local":
return &LocalConnection{}, nil
}
return nil, fmt.Errorf("unknown AEM client type: %s", typeName)
}
Expand Down
Loading
Loading