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

management-api-for-apache-cassandra #2122

Merged
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
29 changes: 29 additions & 0 deletions images/management-api-for-apache-cassandra/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<!--monopod:start-->
# cassandra
| | |
| - | - |
| **OCI Reference** | `cgr.dev/chainguard/cassandra` |


* [View Image in Chainguard Academy](https://edu.chainguard.dev/chainguard/chainguard-images/reference/cassandra/overview/)
* [View Image Catalog](https://console.enforce.dev/images/catalog) for a full list of available tags.
* [Contact Chainguard](https://www.chainguard.dev/chainguard-images) for enterprise support, SLAs, and access to older tags.*

---
<!--monopod:end-->

<!--overview:start-->
[Cassandra](https://cassandra.apache.org) is a free and open-source, distributed, wide-column store, NoSQL database.
<!--overview:end-->

<!--getting:start-->
## Get It!
The image is available on `cgr.dev`:

```
docker pull cgr.dev/chainguard/cassandra:latest
```
<!--getting:end-->

<!--body:start-->
<!--body:end-->
19 changes: 19 additions & 0 deletions images/management-api-for-apache-cassandra/config/main.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
terraform {
required_providers {
apko = { source = "chainguard-dev/apko" }
}
}

variable "extra_packages" {
description = "The additional packages to install."
default = ["management-api-for-apache-cassandra", "management-api-for-apache-cassandra-compat", "metric-collector-for-apache-cassandra", "cassandra", "cassandra-compat"]
}

data "apko_config" "this" {
config_contents = file("${path.module}/template.apko.yaml")
extra_packages = var.extra_packages
}

output "config" {
value = jsonencode(data.apko_config.this.config)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
contents:
packages:
- python3
- busybox
- bash
- tini
- libatasmart
- boost-filesystem
- iproute2

accounts:
groups:
- groupname: cassandra
gid: 999
users:
- username: cassandra
uid: 999
run-as: 999

work-dir: /

entrypoint:
command: "/sbin/tini -g -- /docker-entrypoint.sh"

cmd: mgmtapi

environment:
LANG: en_US.UTF-8
CASSANDRA_HOME: /opt/cassandra
CASSANDRA_VERSION: 4.1.3
PATH: /usr/sbin:/sbin:/usr/bin:/bin:/opt/cassandra/bin/
MGMT_API_LOG_DIR: /var/log/cassandra
CASSANDRA_LOGS_DIR: /opt/cassandra/logs
CASSANDRA_CONF: /opt/cassandra/conf
MAAC_PATH: /opt/management-api
MCAC_PATH: /opt/metrics-collector

paths:
- path: /var/lib/cassandra
type: directory
permissions: 0o777
uid: 999
gid: 999
recursive: true
- path: /opt/cassandra
type: directory
permissions: 0o777
uid: 999
gid: 999
recursive: true
- path: /opt/cassandra/logs
type: directory
permissions: 0o777
uid: 999
gid: 999
recursive: true
- path: /opt/cassandra/conf
type: directory
permissions: 0o777
uid: 999
gid: 999
recursive: true
- path: /var/lib/cassandra
type: directory
permissions: 0o777
uid: 999
gid: 999
- path: /var/log/cassandra
type: directory
permissions: 0o777
uid: 999
gid: 999
recursive: true
- path: /opt/management-api
type: directory
permissions: 0o777
uid: 999
gid: 999
recursive: true
- path: /opt/metrics-collector
type: directory
permissions: 0o777
uid: 999
gid: 999
recursive: true
36 changes: 36 additions & 0 deletions images/management-api-for-apache-cassandra/main.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
terraform {
required_providers {
oci = { source = "chainguard-dev/oci" }
}
}

variable "target_repository" {
description = "The docker repo into which the image and attestations should be published."
}

module "config" { source = "./config" }

module "latest" {
source = "../../tflib/publisher"
name = basename(path.module)
target_repository = var.target_repository
config = module.config.config
build-dev = true
}

module "test-latest" {
source = "./tests"
digest = module.latest.image_ref
}

resource "oci_tag" "latest" {
depends_on = [module.test-latest]
digest_ref = module.latest.image_ref
tag = "latest"
}

resource "oci_tag" "latest-dev" {
depends_on = [module.test-latest]
digest_ref = module.latest.dev_ref
tag = "latest-dev"
}
9 changes: 9 additions & 0 deletions images/management-api-for-apache-cassandra/metadata.hcl
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
name = "cassandra"
image = "cgr.dev/chainguard/cassandra"
logo = "https://storage.googleapis.com/chainguard-academy/logos/cassandra.svg"
endoflife = ""
console_summary = ""
short_description = "[Cassandra](https://cassandra.apache.org) is a free and open-source, distributed, wide-column store, NoSQL database."
compatibility_notes = ""
readme_file = "README.md"
upstream_url = "https://github.com/apache/cassandra"
211 changes: 211 additions & 0 deletions images/management-api-for-apache-cassandra/tests/main.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,211 @@
terraform {
required_providers {
oci = { source = "chainguard-dev/oci" }
kubernetes = {
source = "hashicorp/kubernetes"
version = "~> 2.24.0"
}
}
}

variable "digest" {
description = "The image digest to run tests over."
}

data "oci_string" "ref" { input = var.digest }

resource "random_pet" "suffix" {}

resource "kubernetes_namespace" "cassandra" {
metadata {
name = "cassandra-${random_pet.suffix.id}"
}
}

resource "kubernetes_service" "cassandra" {
metadata {
name = "cassandra"
namespace = kubernetes_namespace.cassandra.metadata[0].name

labels = {
app = "cassandra"
}
}

spec {
port {
port = 9042
}

selector = {
app = "cassandra"
}

cluster_ip = "None"
}
}

resource "kubernetes_stateful_set" "cassandra" {
metadata {
name = "cassandra"
namespace = kubernetes_namespace.cassandra.metadata[0].name

labels = {
app = "cassandra"
}
}

spec {
replicas = 1

selector {
match_labels = {
app = "cassandra"
}
}

template {
metadata {
labels = {
app = "cassandra"
}
}

spec {
container {
name = "cassandra"
image = "${data.oci_string.ref.registry_repo}:${data.oci_string.ref.pseudo_tag}"

port {
name = "intra-node"
container_port = 7000
}

port {
name = "tls-intra-node"
container_port = 7001
}

port {
name = "jmx"
container_port = 7199
}

port {
name = "cql"
container_port = 9042
}

env {
name = "MAX_HEAP_SIZE"
value = "512M"
}

env {
name = "HEAP_NEWSIZE"
value = "100M"
}

env {
name = "CASSANDRA_SEEDS"
value = "cassandra-0.cassandra.default.svc.cluster.local"
}

env {
name = "CASSANDRA_CLUSTER_NAME"
value = "K8Demo"
}

env {
name = "CASSANDRA_DC"
value = "DC1-K8Demo"
}

env {
name = "CASSANDRA_RACK"
value = "Rack1-K8Demo"
}

env {
name = "POD_IP"

value_from {
field_ref {
field_path = "status.podIP"
}
}
}

resources {
limits = {
cpu = "500m"

memory = "1Gi"
}

requests = {
cpu = "500m"

memory = "1Gi"
}
}

volume_mount {
name = "cassandra-data"
mount_path = "/cassandra_data"
}

lifecycle {
pre_stop {
exec {
command = ["/bin/sh", "-c", "nodetool drain"]
}
}
}

image_pull_policy = "Always"

security_context {
capabilities {
add = ["IPC_LOCK"]
}
}
}

termination_grace_period_seconds = 1800
}
}

volume_claim_template {
metadata {
name = "cassandra-data"
}

spec {
access_modes = ["ReadWriteOnce"]

resources {
requests = {
storage = "1Gi"
}
}

storage_class_name = "local-path" # Assumes K3s, use standard for KinD
}
}

service_name = kubernetes_service.cassandra.metadata[0].name
}
}

data "oci_exec_test" "runs" {
digest = var.digest
depends_on = [kubernetes_stateful_set.cassandra]
script = "./smoke-test.sh"
working_dir = path.module

env {
name = "CASSANDRA_STATEFULSET_NAMESPACE"
value = kubernetes_namespace.cassandra.metadata[0].name
}
}
Loading
Loading