Compare commits

...

5 Commits

Author SHA1 Message Date
Michael Francis 39bab0cb3a fixed .gitignore, added missing files 2024-05-26 14:10:49 -04:00
Michael Francis f536c33298 Use localhost instead of service name 2024-05-26 13:02:55 -04:00
Michael Francis 15ebb45854 Use the right field for the compute image 2024-05-26 13:00:54 -04:00
Michael Francis 0db4679a29 Update crd 2024-05-26 13:00:19 -04:00
Michael Francis 90c9e15841 Easier to work with dockerignore 2024-05-26 13:00:13 -04:00
10 changed files with 292 additions and 72 deletions

View File

@ -1,4 +1,12 @@
target # Ignore everything by default
Tiltfile
manifests *
orig-compose
# Except the stuff we need
!.dockerignore
!Dockerfile
!orig-compose/
!src/
!Cargo.lock
!Cargo.toml

4
.gitignore vendored
View File

@ -1,3 +1 @@
/target target
Tiltfile
manifests/

121
Tiltfile Normal file
View File

@ -0,0 +1,121 @@
# Welcome to Tilt!
# To get you started as quickly as possible, we have created a
# starter Tiltfile for you.
#
# Uncomment, modify, and delete any commands as needed for your
# project's configuration.
# Output diagnostic messages
# You can print log messages, warnings, and fatal errors, which will
# appear in the (Tiltfile) resource in the web UI. Tiltfiles support
# multiline strings and common string operations such as formatting.
#
# More info: https://docs.tilt.dev/api.html#api.warn
print("""
-----------------------------------------------------------------
✨ Hello Tilt! This appears in the (Tiltfile) pane whenever Tilt
evaluates this file.
-----------------------------------------------------------------
""".strip())
# Build Docker image
# Tilt will automatically associate image builds with the resource(s)
# that reference them (e.g. via Kubernetes or Docker Compose YAML).
# More info: https://docs.tilt.dev/api.html#api.docker_build
docker_build('melenion/neon-operator',
context='.',
)
docker_build('melenion/compute-node-v15', context="orig-compose/compute_wrapper", build_args={"REPOSITORY": "neondatabase", "COMPUTE_IMAGE": "compute-node-v15"})
k8s_yaml("crd.yaml")
k8s_kind('NeonDatabase', image_json_path='{.spec.compute_image_ref}')
# Apply Kubernetes manifests
# Tilt will build & push any necessary images, re-deploying your
# resources as they change.
#
# More info: https://docs.tilt.dev/api.html#api.k8s_yaml
#
k8s_yaml(['manifests/deployment.yaml', 'manifests/rbac.yaml', 'manifests/example.yaml'])
# Customize a Kubernetes resource
# By default, Kubernetes resource names are automatically assigned
# based on objects in the YAML manifests, e.g. Deployment name.
#
# Tilt strives for sane defaults, so calling k8s_resource is
# optional, and you only need to pass the arguments you want to
# override.
#
# More info: https://docs.tilt.dev/api.html#api.k8s_resource
#
# k8s_resource('my-deployment',
# # map one or more local ports to ports on your Pod
# port_forwards=['5000:8080'],
# # change whether the resource is started by default
# auto_init=False,
# # control whether the resource automatically updates
# trigger_mode=TRIGGER_MODE_MANUAL
# )
# Run local commands
# Local commands can be helpful for one-time tasks like installing
# project prerequisites. They can also manage long-lived processes
# for non-containerized services or dependencies.
#
# More info: https://docs.tilt.dev/local_resource.html
#
# local_resource('install-helm',
# cmd='which helm > /dev/null || brew install helm',
# # `cmd_bat`, when present, is used instead of `cmd` on Windows.
# cmd_bat=[
# 'powershell.exe',
# '-Noninteractive',
# '-Command',
# '& {if (!(Get-Command helm -ErrorAction SilentlyContinue)) {scoop install helm}}'
# ]
# )
# Extensions are open-source, pre-packaged functions that extend Tilt
#
# More info: https://github.com/tilt-dev/tilt-extensions
#
load('ext://git_resource', 'git_checkout')
# Organize logic into functions
# Tiltfiles are written in Starlark, a Python-inspired language, so
# you can use functions, conditionals, loops, and more.
#
# More info: https://docs.tilt.dev/tiltfile_concepts.html
#
def tilt_demo():
# Tilt provides many useful portable built-ins
# https://docs.tilt.dev/api.html#modules.os.path.exists
if os.path.exists('tilt-avatars/Tiltfile'):
# It's possible to load other Tiltfiles to further organize
# your logic in large projects
# https://docs.tilt.dev/multiple_repos.html
load_dynamic('tilt-avatars/Tiltfile')
watch_file('tilt-avatars/Tiltfile')
git_checkout('https://github.com/tilt-dev/tilt-avatars.git',
checkout_dir='tilt-avatars')
# Edit your Tiltfile without restarting Tilt
# While running `tilt up`, Tilt watches the Tiltfile on disk and
# automatically re-evaluates it on change.
#
# To see it in action, try uncommenting the following line with
# Tilt running.
# tilt_demo()

125
crd.yaml
View File

@ -1,69 +1,72 @@
apiVersion: v1 apiVersion: v1
items: items:
- apiVersion: apiextensions.k8s.io/v1 - apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition kind: CustomResourceDefinition
metadata: metadata:
creationTimestamp: "2024-05-24T17:05:01Z" creationTimestamp: "2024-05-26T16:36:02Z"
generation: 1 generation: 1
name: neondatabases.melenion.com name: neondatabases.melenion.com
resourceVersion: "32345" resourceVersion: "1639"
uid: c72c3bea-c002-4a74-a91a-f6d1a36f683d uid: 67a48c88-e122-4e7a-a2d2-92ed68ef989e
spec: spec:
conversion: conversion:
strategy: None strategy: None
group: melenion.com group: melenion.com
names: names:
kind: NeonDatabase kind: NeonDatabase
listKind: NeonDatabaseList listKind: NeonDatabaseList
plural: neondatabases plural: neondatabases
shortNames: shortNames:
- nd - nd
singular: neondatabase singular: neondatabase
scope: Namespaced scope: Namespaced
versions: versions:
- name: v1 - name: v1
schema: schema:
openAPIV3Schema: openAPIV3Schema:
description: Auto-generated derived type for NeondatabaseSpec via `CustomResource` description: Auto-generated derived type for NeondatabaseSpec via `CustomResource`
properties:
spec:
properties: properties:
neon_image_ref: spec:
type: string properties:
postgres_version: compute_image_ref:
type: string type: string
neon_image_ref:
type: string
postgres_version:
type: string
required:
- compute_image_ref
- neon_image_ref
- postgres_version
type: object
required: required:
- neon_image_ref - spec
- postgres_version title: NeonDatabase
type: object type: object
required: served: true
- spec storage: true
title: NeonDatabase subresources: {}
type: object status:
served: true acceptedNames:
storage: true kind: NeonDatabase
subresources: {} listKind: NeonDatabaseList
status: plural: neondatabases
acceptedNames: shortNames:
kind: NeonDatabase - nd
listKind: NeonDatabaseList singular: neondatabase
plural: neondatabases conditions:
shortNames: - lastTransitionTime: "2024-05-26T16:36:02Z"
- nd message: no conflicts found
singular: neondatabase reason: NoConflicts
conditions: status: "True"
- lastTransitionTime: "2024-05-24T17:05:01Z" type: NamesAccepted
message: no conflicts found - lastTransitionTime: "2024-05-26T16:36:02Z"
reason: NoConflicts message: the initial names have been accepted
status: "True" reason: InitialNamesAccepted
type: NamesAccepted status: "True"
- lastTransitionTime: "2024-05-24T17:05:01Z" type: Established
message: the initial names have been accepted storedVersions:
reason: InitialNamesAccepted - v1
status: "True"
type: Established
storedVersions:
- v1
kind: List kind: List
metadata: metadata:
resourceVersion: "" resourceVersion: ""

24
manifests/deployment.yaml Normal file
View File

@ -0,0 +1,24 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: neon-operator
spec:
selector:
matchLabels:
app: neon-operator
strategy:
type: Recreate
template:
metadata:
labels:
app: neon-operator
spec:
containers:
- name: neon-operator
image: melenion/neon-operator:latest
imagePullPolicy: Always
resources:
limits:
memory: "128Mi"
cpu: "500m"
serviceAccountName: neon-operator

8
manifests/example.yaml Normal file
View File

@ -0,0 +1,8 @@
apiVersion: melenion.com/v1
kind: NeonDatabase
metadata:
name: my-neon-database
spec:
compute_image_ref: "melenion/compute-node-v15"
neon_image_ref: "neondatabase/neon"
postgres_version: "15"

54
manifests/rbac.yaml Normal file
View File

@ -0,0 +1,54 @@
apiVersion: v1
kind: ServiceAccount
metadata:
name: neon-operator
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: neon-operator-cluster-role
rules:
- apiGroups:
- melenion.com
resources:
- neondatabases
verbs:
- "*"
- apiGroups: [""]
resources:
- pods
- services
- endpoints
- persistentvolumeclaims
- events
- configmaps
- secrets
- deployments
verbs:
- "*"
- apiGroups:
- apiextensions.k8s.io
resources:
- customresourcedefinitions
verbs:
- "*"
- apiGroups:
- apps
resources:
- deployments
- statefulsets
verbs:
- "*"
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: neon-operator-cluster-role-binding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: neon-operator-cluster-role
subjects:
- kind: ServiceAccount
name: neon-operator
namespace: default

View File

@ -109,7 +109,7 @@ async fn reconcile(neon: Arc<NeonDatabase>, context: Arc<ContextData>) -> Result
neon::reconcile_storage_broker(client.clone(), &namespace).await?; neon::reconcile_storage_broker(client.clone(), &namespace).await?;
neon::reconcile_page_server(client.clone(), &namespace).await?; neon::reconcile_page_server(client.clone(), &namespace).await?;
neon::reconcile_safe_keepers(client.clone(), &namespace).await?; neon::reconcile_safe_keepers(client.clone(), &namespace).await?;
neon::reconcile_compute(client.clone(), &namespace, &neon.spec.neon_image_ref).await?; neon::reconcile_compute(client.clone(), &namespace, &neon.spec.compute_image_ref).await?;
Ok(Action::requeue(Duration::from_secs(5))) Ok(Action::requeue(Duration::from_secs(5)))
} }

View File

@ -88,7 +88,7 @@ pub async fn create_deployment(client: Client, namespace: &str) -> Result<(), Er
]), ]),
image: Some("minio/mc".to_string()), image: Some("minio/mc".to_string()),
command: Some(vec!["bash".to_string(), "-c".to_string()]), command: Some(vec!["bash".to_string(), "-c".to_string()]),
args: Some(vec!["until (/usr/bin/mc alias set minio http://minio:9000 $$MINIO_ROOT_USER $$MINIO_ROOT_PASSWORD) do args: Some(vec!["until (/usr/bin/mc alias set minio http://localhost:9000 $$MINIO_ROOT_USER $$MINIO_ROOT_PASSWORD) do
echo 'Waiting to start minio...' && sleep 1; echo 'Waiting to start minio...' && sleep 1;
done; done;
/usr/bin/mc mb --ignore-existing minio/neon --region=eu-north-1; /usr/bin/mc mb --ignore-existing minio/neon --region=eu-north-1;

View File

@ -373,7 +373,11 @@ pub async fn reconcile_safe_keepers(client: Client, namespace: &str) -> Result<(
Ok(()) Ok(())
} }
pub async fn reconcile_compute(client: Client, namespace: &str, image: &str) -> Result<(), Error> { pub async fn reconcile_compute(
client: Client,
namespace: &str,
compute_image: &str,
) -> Result<(), Error> {
let deployment = Deployment { let deployment = Deployment {
metadata: ObjectMeta { metadata: ObjectMeta {
name: Some("compute".to_string()), name: Some("compute".to_string()),
@ -394,7 +398,7 @@ pub async fn reconcile_compute(client: Client, namespace: &str, image: &str) ->
spec: Some(PodSpec { spec: Some(PodSpec {
containers: vec![Container { containers: vec![Container {
name: "compute".to_string(), name: "compute".to_string(),
image: Some(image.to_string()), image: Some(compute_image.to_string()),
ports: Some(vec![ContainerPort { ports: Some(vec![ContainerPort {
container_port: 9898, container_port: 9898,
..Default::default() ..Default::default()