Skip to main content

Prepare & Upload Application Package

This guide covers the complete process of preparing and uploading your application package for Armada Edge Platform marketplace certification.

Package Requirements​

Required Components​

Your application package must include:

package_components:
container_images:
- images_pushed_to_registry: true
- all_architectures_supported: true
- images_properly_tagged: true

kubernetes_manifests:
- deployment_yaml: true
- service_yaml: true
- ingress_yaml: true
- configmap_yaml: true
- secret_yaml: true
- pvc_yaml: true
- rbac_yaml: true
- network_policy_yaml: true

helm_charts:
- chart_yaml: true
- values_yaml: true
- templates_directory: true
- dependencies_resolved: true

documentation:
- readme_md: true
- install_md: true
- configuration_md: true
- troubleshooting_md: true
- api_documentation: true

security_artifacts:
- vulnerability_scan_results: true
- sbom_file: true
- image_signatures: true

Container Images​

Image Requirements​

Container image specifications:

image_requirements:
base_images:
- ubuntu:22.04
- alpine:3.18
- debian:bullseye-slim
- distroless/static:nonroot

architecture_support:
- linux/amd64: true
- linux/arm64: true
- windows/amd64: false # If applicable

image_standards:
- non_root_user: true
- security_scanned: true
- properly_tagged: true
- size_optimized: true

Image Preparation​

Prepare your container images:

# Build multi-architecture images
docker buildx build --platform linux/amd64,linux/arm64 \
-t your-registry/myapp:v1.2.0 \
--push .

# Sign images with Cosign
cosign sign --key cosign.key your-registry/myapp:v1.2.0

# Generate SBOM
trivy image --format cyclonedx your-registry/myapp:v1.2.0 > sbom.json

# Scan for vulnerabilities
trivy image --severity HIGH,CRITICAL your-registry/myapp:v1.2.0

Registry Configuration​

Configure container registry access:

registry_configuration:
primary_registry:
registry_url: "registry.example.com"
authentication_required: true
public_registry: false

access_credentials:
username_provided: true
token_provided: true
service_account_provided: false

image_details:
base_repository: "mycompany/myapp"
image_naming_convention: "myapp:v{version}"
supported_architectures: ["linux/amd64", "linux/arm64"]

image_tags:
- tag: "v1.2.0"
description: "Latest stable release"
update_frequency: "every_release"
recommended_for: "production"

Kubernetes Manifests​

Required Manifests​

Create all required Kubernetes manifests:

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
labels:
app: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: registry.example.com/myapp:v1.2.0
ports:
- containerPort: 8080
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /health
port: 8080
readinessProbe:
httpGet:
path: /ready
port: 8080
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
selector:
app: myapp
ports:
- port: 80
targetPort: 8080
type: ClusterIP
# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: myapp-service
port:
number: 80

Configuration Management​

Create ConfigMaps and Secrets:

# configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: myapp-config
data:
APP_ENV: "production"
LOG_LEVEL: "INFO"
DATABASE_URL: "postgresql://db:5432/myapp"
REDIS_URL: "redis://redis:6379"
# secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: myapp-secrets
type: Opaque
data:
# Base64 encoded values
db-password: <base64-encoded-password>
api-key: <base64-encoded-api-key>

Helm Charts​

Chart Structure​

Create a complete Helm chart:

# Chart.yaml
apiVersion: v2
name: myapp
description: A Helm chart for MyApp
type: application
version: 0.1.0
appVersion: "1.2.0"
keywords:
- webapp
- api
home: https://github.com/mycompany/myapp
sources:
- https://github.com/mycompany/myapp
maintainers:
- name: Your Name
email: your.email@company.com
dependencies:
- name: postgresql
version: 12.x.x
repository: https://charts.bitnami.com/bitnami
# values.yaml
app:
name: myapp
image:
repository: registry.example.com/myapp
tag: "1.2.0"
pullPolicy: IfNotPresent
replicas: 3
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"

database:
enabled: true
type: postgresql
host: postgresql
port: 5432
name: myapp
user: myapp
password: ""

ingress:
enabled: true
className: nginx
hosts:
- host: myapp.example.com
paths:
- path: /
pathType: Prefix

Chart Templates​

Create template files:

# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "myapp.fullname" . }}
labels:
{{- include "myapp.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.app.replicas }}
selector:
matchLabels:
{{- include "myapp.selectorLabels" . | nindent 6 }}
template:
metadata:
labels:
{{- include "myapp.selectorLabels" . | nindent 8 }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.app.image.repository }}:{{ .Values.app.image.tag }}"
imagePullPolicy: {{ .Values.app.image.pullPolicy }}
ports:
- containerPort: 8080
resources:
{{- toYaml .Values.app.resources | nindent 12 }}

Documentation Requirements​

Required Documentation​

Create comprehensive documentation:

# README.md
# MyApp

## Overview
Brief description of your application and its key features.

## Quick Start
```bash
# Install with Helm
helm install myapp ./charts/myapp

# Or with kubectl
kubectl apply -f manifests/

Configuration​

Describe configuration options and environment variables.

Troubleshooting​

Common issues and their solutions.


```markdown
# INSTALL.md
# Installation Guide

## Prerequisites
- Kubernetes 1.20+
- Helm 3.8+
- Container registry access

## Installation Steps
1. Add Helm repository
2. Update dependencies
3. Install chart
4. Verify deployment

## Configuration
Detailed configuration options.

API Documentation​

Provide API documentation:

# OpenAPI/Swagger specification
openapi: 3.0.0
info:
title: MyApp API
version: 1.2.0
description: API documentation for MyApp

paths:
/health:
get:
summary: Health check endpoint
responses:
'200':
description: Application is healthy

/api/v1/data:
get:
summary: Get data
responses:
'200':
description: Data retrieved successfully

Security Artifacts​

Vulnerability Scanning​

Perform security scanning:

# Scan container images
trivy image --severity HIGH,CRITICAL your-registry/myapp:v1.2.0

# Scan application dependencies
trivy fs --severity HIGH,CRITICAL .

# Generate scan report
trivy image --format json --output scan-report.json your-registry/myapp:v1.2.0

SBOM Generation​

Generate Software Bill of Materials:

# Generate SBOM with Trivy
trivy image --format cyclonedx your-registry/myapp:v1.2.0 > sbom.json

# Or with Syft
syft your-registry/myapp:v1.2.0 -o cyclonedx-json > sbom.json

SBOM Content:

{
"bomFormat": "CycloneDX",
"specVersion": "1.4",
"version": 1,
"metadata": {
"timestamp": "2024-01-15T10:00:00Z",
"tools": [
{
"vendor": "Aqua Security",
"name": "Trivy",
"version": "0.40.0"
}
]
},
"components": [
{
"type": "application",
"name": "myapp",
"version": "1.2.0",
"purl": "pkg:docker/registry.example.com/myapp@1.2.0"
}
]
}

Image Signing​

Sign your container images:

# Generate signing keys
cosign generate-key-pair

# Sign image
cosign sign --key cosign.key your-registry/myapp:v1.2.0

# Verify signature
cosign verify --key cosign.pub your-registry/myapp:v1.2.0

Package Assembly​

Create Package Structure​

Organize your package:

# Create package directory
mkdir myapp-package-v1.2.0
cd myapp-package-v1.2.0

# Create subdirectories
mkdir manifests charts docs security

# Copy files
cp -r ../manifests/* manifests/
cp -r ../charts/* charts/
cp -r ../docs/* docs/
cp ../sbom.json security/
cp ../scan-report.json security/

Package Contents​

Final package structure:

myapp-package-v1.2.0/
├── manifests/
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── ingress.yaml
│ ├── configmap.yaml
│ ├── secret.yaml
│ ├── pvc.yaml
│ ├── rbac.yaml
│ └── network-policy.yaml
├── charts/
│ ├── Chart.yaml
│ ├── values.yaml
│ ├── values-production.yaml
│ └── templates/
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── ingress.yaml
│ ├── configmap.yaml
│ ├── secret.yaml
│ ├── pvc.yaml
│ ├── rbac.yaml
│ ├── network-policy.yaml
│ ├── _helpers.tpl
│ └── NOTES.txt
├── docs/
│ ├── README.md
│ ├── INSTALL.md
│ ├── CONFIGURATION.md
│ ├── TROUBLESHOOTING.md
│ └── API.md
├── security/
│ ├── sbom.json
│ ├── scan-report.json
│ └── image-signatures/
└── metadata.yaml

Metadata File​

Create package metadata:

# metadata.yaml
app_name: "MyApp"
version: "1.2.0"
publisher_name: "MyCompany Inc."
submission_date: "2024-01-15"
assessment_type: "new_application"

# Container registry information
container_registry:
registry_url: "registry.example.com"
authentication_required: true
images:
- "mycompany/myapp:v1.2.0"
- "mycompany/myapp-frontend:v1.2.0"
- "mycompany/myapp-backend:v1.2.0"

# Resource requirements
resources:
cpu_requests: "500m"
cpu_limits: "1000m"
memory_requests: "512Mi"
memory_limits: "1Gi"
storage_required: "10Gi"

# Compatibility
compatibility:
kubernetes_min_version: "1.20.0"
kubernetes_max_tested: "1.25.4"
container_runtimes: ["containerd", "cri-o"]

# Security
security:
vulnerability_scan_completed: true
sbom_generated: true
images_signed: true
scan_tool: "Trivy"
scan_date: "2024-01-15"

Upload Process​

Package Compression​

Compress your package:

# Create compressed package
tar -czf myapp-package-v1.2.0.tar.gz myapp-package-v1.2.0/

# Verify package contents
tar -tzf myapp-package-v1.2.0.tar.gz

Upload to Platform​

Upload your package:

# Upload to certification portal
curl -X POST \
-H "Authorization: Bearer $API_TOKEN" \
-F "package=@myapp-package-v1.2.0.tar.gz" \
-F "metadata=@metadata.yaml" \
https://certification.armada-systems.com/api/v1/submissions

Upload Verification​

Verify upload success:

# Check upload status
curl -H "Authorization: Bearer $API_TOKEN" \
https://certification.armada-systems.com/api/v1/submissions/$SUBMISSION_ID

# Expected response
{
"submission_id": "sub_12345",
"status": "uploaded",
"package_size": "15.2MB",
"upload_date": "2024-01-15T10:30:00Z",
"next_step": "security_scan"
}

Package Validation​

Pre-Upload Validation​

Validate your package before upload:

# Run validation script
./validate-package.sh myapp-package-v1.2.0/

# Check for required files
./check-requirements.py myapp-package-v1.2.0/

# Validate Helm chart
helm lint charts/myapp/

# Test deployment
helm install test-release charts/myapp --dry-run

Validation Checklist​

Complete validation checklist:

validation_checklist:
package_structure:
- [ ] All required directories present
- [ ] All required files included
- [ ] No unnecessary files included
- [ ] File permissions correct

container_images:
- [ ] Images pushed to registry
- [ ] Images properly tagged
- [ ] Images security scanned
- [ ] Images signed
- [ ] SBOM generated

kubernetes_manifests:
- [ ] All manifests valid YAML
- [ ] All manifests apply successfully
- [ ] Resource limits defined
- [ ] Health checks configured
- [ ] Security policies applied

helm_charts:
- [ ] Chart passes helm lint
- [ ] Dependencies resolved
- [ ] Values properly documented
- [ ] Chart installs successfully

documentation:
- [ ] README.md complete
- [ ] Installation guide provided
- [ ] Configuration documented
- [ ] Troubleshooting guide included
- [ ] API documentation provided

Next Steps​

After uploading your package:

  1. Monitor Progress: Track certification progress
  2. Respond to Issues: Address any findings
  3. Provide Additional Info: If requested
  4. Prepare for Testing: Be ready for deployment testing

For upload assistance, contact: