Skip to content

Commit 0adc69b

Browse files
mariam-elshakfythomas-roos
authored andcommitted
greengrass: Modularize plugin architecture
Restructure greengrass recipes to support a modular plugin design, separating each plugin into its own recipe that can inherit a common bbclass to install the plugin jar + config fragment. This allows easier extension with new plugins. Signed-off-by: Mariam Elshakfy <[email protected]>
1 parent ec50dea commit 0adc69b

File tree

11 files changed

+131
-58
lines changed

11 files changed

+131
-58
lines changed

classes/greengrass-common.inc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# Common Greengrass definitions
2+
3+
GG_BASENAME = "greengrass/v2"
4+
GG_ROOT = "${D}/${GG_BASENAME}"

classes/greengrass-plugin.bbclass

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# Common installation logic for AWS Greengrass plugins
2+
# Requires:
3+
# PLUGIN_SRC_NAME - JAR filename in ${UNPACKDIR}
4+
# PLUGIN_NAME - target filename under plugins/trusted
5+
6+
require greengrass-common.inc
7+
8+
inherit deploy
9+
10+
S = "${UNPACKDIR}"
11+
12+
do_install() {
13+
# Install plugin jar
14+
install -d ${GG_ROOT}/plugins
15+
install -d ${GG_ROOT}/plugins/trusted
16+
install --m 0755 ${UNPACKDIR}/${PLUGIN_SRC_NAME} \
17+
${GG_ROOT}/plugins/trusted/${PLUGIN_NAME}
18+
}
19+
20+
do_deploy() {
21+
# Configurations will be merged in greengrass-bin:do_install later,
22+
# so make them shared.
23+
if [ -e ${UNPACKDIR}/config.yaml.template ]; then
24+
install -d ${DEPLOYDIR}/greengrass-plugin-fragments
25+
cp "${UNPACKDIR}/config.yaml.template" "${DEPLOYDIR}/greengrass-plugin-fragments/${PLUGIN_NAME}.yaml"
26+
fi
27+
}
28+
addtask deploy after do_install before do_populate_sysroot
29+
30+
FILES:${PN} += "/${GG_BASENAME}/plugins/ \
31+
"

recipes-iot/aws-iot-greengrass/greengrass-bin/config.yaml.template

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,4 @@ services:
55
awsRegion: "${AWS_DEFAULT_REGION}"
66
runWithDefault:
77
posixUser: "${PROXY_USER}"
8-
aws.greengrass.FleetProvisioningByClaim:
9-
configuration:
10-
rootPath: "/greengrass/v2"
11-
awsRegion: "${AWS_DEFAULT_REGION}"
12-
iotDataEndpoint: "${IOT_DATA_ENDPOINT}"
13-
iotCredentialEndpoint: "${IOT_CRED_ENDPOINT}"
14-
iotRoleAlias: "${TE_ROLE_ALIAS}"
15-
provisioningTemplate: "${FLEET_PROVISIONING_TEMPLATE_NAME}"
16-
claimCertificatePath: "${CLAIM_CERT_PATH}"
17-
claimCertificatePrivateKeyPath: "${CLAIM_KEY_PATH}"
18-
rootCaPath: "${ROOT_CA_PATH}"
19-
templateParameters:
20-
ThingName: "${THING_NAME}_<unique>"
21-
ThingGroupName: "${THING_GROUP_NAME}"
228
---

recipes-iot/aws-iot-greengrass/greengrass-bin_2.14.1.bb

100644100755
Lines changed: 20 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,7 @@ DESCRIPTION = "The Greengrass nucleus component provides functionality for devic
33
HOMEPAGE = "https://github.com/aws-greengrass/aws-greengrass-nucleus"
44
LICENSE = "Apache-2.0"
55

6-
GG_BASENAME = "greengrass/v2"
7-
GG_ROOT = "${D}/${GG_BASENAME}"
8-
# GGV2_FLEETPROVISIONING_VERSION ?= "latest"
9-
GGV2_FLEETPROVISIONING_VERSION ?= "1.2.2"
10-
GGV2_FLEET_PROVISIONING_TEMPLATE_NAME ?= "GreengrassFleetProvisioningTemplate"
6+
require classes/greengrass-common.inc
117

128
LIC_FILES_CHKSUM = "file://${UNPACKDIR}/greengrass-bin/LICENSE;md5=34400b68072d710fecd0a2940a0d1658"
139

@@ -16,35 +12,29 @@ DEPENDS += "gettext-native"
1612
# enable fleetprovisioning for testing by default to get test coverage
1713
PACKAGECONFIG ??= "${@bb.utils.contains('PTEST_ENABLED', '1', 'fleetprovisioning', '', d)}"
1814

19-
# this is to make the PACKAGECONFIG QA check happy
20-
PACKAGECONFIG[fleetprovisioning] = ""
15+
PACKAGECONFIG[fleetprovisioning] = ",,greengrass-plugin-fleetprovisioning,greengrass-plugin-fleetprovisioning"
2116

2217
SRC_URI = "\
2318
https://d2s8p88vqu9w66.cloudfront.net/releases/greengrass-${PV}.zip;subdir=greengrass-bin \
2419
file://greengrassv2-init.yaml \
2520
file://run-ptest \
21+
file://config.yaml.template \
2622
"
2723

2824
SRC_URI:append = " ${@bb.utils.contains('PACKAGECONFIG', 'fleetprovisioning', '\
29-
https://d2s8p88vqu9w66.cloudfront.net/releases/aws-greengrass-FleetProvisioningByClaim/fleetprovisioningbyclaim-${GGV2_FLEETPROVISIONING_VERSION}.jar;name=fleetprovisioning;unpack=0 \
30-
file://config.yaml.template \
31-
file://replace_board_id.sh \
32-
file://claim.pkey.pem \
33-
file://claim.cert.pem \
34-
file://claim.root.pem \
3525
file://loader.patch \
3626
file://greengrass.service.patch \
3727
', '', d)}"
3828

3929
SRC_URI[sha256sum] = "a7cbc3cee5d245bfac9c49a036a482884898edbeb2f1e6fb27d17e9321007ce8"
40-
SRC_URI[fleetprovisioning.sha256sum] = "1e7fdc625d4e1e7795d63f0e97981feecad526277bf211154505de145009e8c1"
4130
UPSTREAM_CHECK_REGEX ?= "releases/tag/v?(?P<pver>\d+(\.\d+)+)"
4231

4332
UPSTREAM_CHECK_URI = "https://github.com/aws-greengrass/aws-greengrass-nucleus/tags"
4433

4534
GG_USESYSTEMD = "${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'yes', 'no', d)}"
4635

4736
inherit systemd useradd ptest pkgconfig
37+
DEPENDS:append = " yq-native"
4838

4939
S = "${UNPACKDIR}/greengrass-bin"
5040

@@ -76,7 +66,7 @@ do_install() {
7666
ln -s /${GG_BASENAME}/packages/artifacts-unarchived/aws.greengrass.Nucleus/${PV}/aws.greengrass.nucleus ${GG_ROOT}/alts/init/distro
7767

7868
install -m 0440 ${S}/LICENSE ${GG_ROOT}
79-
install -m 0640 ${S}/../greengrassv2-init.yaml ${GG_ROOT}/config/config.yaml.clean
69+
install -m 0640 ${S}/../greengrassv2-init.yaml ${GG_ROOT}/config/config.yaml.clean
8070
install -m 0640 ${S}/bin/greengrass.service.template ${GG_ROOT}/packages/artifacts-unarchived/aws.greengrass.Nucleus/${PV}/aws.greengrass.nucleus/bin/greengrass.service.template
8171
install -m 0750 ${S}/bin/loader ${GG_ROOT}/packages/artifacts-unarchived/aws.greengrass.Nucleus/${PV}/aws.greengrass.nucleus/bin/loader
8272
install -m 0640 ${S}/conf/recipe.yaml ${GG_ROOT}/packages/artifacts-unarchived/aws.greengrass.Nucleus/${PV}/aws.greengrass.nucleus/conf/recipe.yaml
@@ -90,37 +80,23 @@ do_install() {
9080
sed -i -e "s,REPLACE_WITH_GG_LOADER_FILE,/${GG_BASENAME}/alts/current/distro/bin/loader,g" ${D}${systemd_unitdir}/system/greengrass.service
9181
sed -i -e "s,REPLACE_WITH_GG_LOADER_PID_FILE,/var/run/greengrass.pid,g" ${D}${systemd_unitdir}/system/greengrass.service
9282

93-
if ${@bb.utils.contains('PACKAGECONFIG','fleetprovisioning','true','false',d)}; then
94-
95-
install -d ${GG_ROOT}/claim-certs
96-
install -d ${GG_ROOT}/plugins
97-
install -d ${GG_ROOT}/plugins/trusted
98-
install -m 0440 ${UNPACKDIR}/claim.pkey.pem ${GG_ROOT}/claim-certs
99-
install -m 0440 ${UNPACKDIR}/claim.cert.pem ${GG_ROOT}/claim-certs
100-
install -m 0440 ${UNPACKDIR}/claim.root.pem ${GG_ROOT}/claim-certs
101-
102-
install -m 0740 ${UNPACKDIR}/fleetprovisioningbyclaim-${GGV2_FLEETPROVISIONING_VERSION}.jar ${GG_ROOT}/plugins/trusted/aws.greengrass.FleetProvisioningByClaim.jar
103-
104-
install -m 0755 ${UNPACKDIR}/replace_board_id.sh ${GG_ROOT}/config/
105-
106-
install -m 0640 ${UNPACKDIR}/config.yaml.template ${GG_ROOT}/config/config.yaml
107-
108-
AWS_DEFAULT_REGION=${GGV2_REGION} \
109-
PROXY_USER=ggc_user:ggc_group \
110-
IOT_DATA_ENDPOINT=${GGV2_DATA_EP} \
111-
IOT_CRED_ENDPOINT=${GGV2_CRED_EP} \
112-
TE_ROLE_ALIAS=${GGV2_TES_RALIAS} \
113-
FLEET_PROVISIONING_TEMPLATE_NAME=${GGV2_FLEET_PROVISIONING_TEMPLATE_NAME} \
114-
CLAIM_CERT_PATH=/${GG_BASENAME}/claim-certs/claim.cert.pem \
115-
CLAIM_KEY_PATH=/${GG_BASENAME}/claim-certs/claim.pkey.pem \
116-
ROOT_CA_PATH=/${GG_BASENAME}/claim-certs/claim.root.pem \
117-
THING_NAME=${GGV2_THING_NAME} \
118-
THING_GROUP_NAME=${GGV2_THING_GROUP} \
119-
envsubst < ${UNPACKDIR}/config.yaml.template > ${GG_ROOT}/config/config.yaml
120-
fi
83+
# Install base config.yml
84+
AWS_DEFAULT_REGION=${GGV2_REGION} \
85+
PROXY_USER=ggc_user:ggc_group \
86+
envsubst < ${UNPACKDIR}/config.yaml.template > ${GG_ROOT}/config/config.yaml
12187
}
12288

123-
CONFFILES:${PN} += "/${GG_BASENAME}/config/config.yaml.clean"
89+
do_merge_config() {
90+
# Merge config fragments
91+
yq eval-all '. as $item ireduce ({}; . * $item)' \
92+
"${GG_ROOT}/config/config.yaml" \
93+
"${DEPLOY_DIR_IMAGE}/greengrass-plugin-fragments/"*.yaml \
94+
> "${GG_ROOT}/config/config.yaml.tmp"
95+
96+
mv "${GG_ROOT}/config/config.yaml.tmp" "${GG_ROOT}/config/config.yaml"
97+
98+
}
99+
addtask merge_config after do_install before do_package
124100

125101
SYSTEMD_AUTO_ENABLE = "enable"
126102
SYSTEMD_SERVICE:${PN} = "greengrass.service"
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
GG_BASENAME = "greengrass/v2"
2+
GG_ROOT = "${D}/${GG_BASENAME}"
3+
GG_CONFIG = "${GG_ROOT}/config"
4+
${GG_ROOT}/plugins = "${GG_ROOT}/plugins"
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
services:
2+
aws.greengrass.FleetProvisioningByClaim:
3+
configuration:
4+
rootPath: "/greengrass/v2"
5+
awsRegion: "${AWS_DEFAULT_REGION}"
6+
iotDataEndpoint: "${IOT_DATA_ENDPOINT}"
7+
iotCredentialEndpoint: "${IOT_CRED_ENDPOINT}"
8+
iotRoleAlias: "${TE_ROLE_ALIAS}"
9+
provisioningTemplate: "${FLEET_PROVISIONING_TEMPLATE_NAME}"
10+
claimCertificatePath: "${CLAIM_CERT_PATH}"
11+
claimCertificatePrivateKeyPath: "${CLAIM_KEY_PATH}"
12+
rootCaPath: "${ROOT_CA_PATH}"
13+
templateParameters:
14+
ThingName: "${THING_NAME}_<unique>"
15+
ThingGroupName: "${THING_GROUP_NAME}"

0 commit comments

Comments
 (0)