Skip to content

Commit

Permalink
Merge branch 'release/0.2.0'
Browse files Browse the repository at this point in the history
  • Loading branch information
zacksiri committed Jul 5, 2024
2 parents f876a23 + 33faf63 commit efd717b
Show file tree
Hide file tree
Showing 87 changed files with 2,155 additions and 68 deletions.
1 change: 1 addition & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -151,3 +151,4 @@ jobs:
POSTGRES_PASSWORD: postgres
POSTGRES_PORT: ${{ job.services.postgres.ports[5432] }}
DEFAULT_CDN_HOST: some.domain.com
POLAR_CLOAK_KEY: ${{secrets.POLAR_CLOAK_KEY}}
2 changes: 1 addition & 1 deletion .github/workflows/deployment.yml
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,6 @@ jobs:
env:
WORKFLOW_REF: ${{ github.event.workflow_run.head_branch }}
WORKFLOW_SHA: ${{ github.event.workflow_run.head_sha }}
INSTELLAR_ENDPOINT: https://opsmaru.com
INSTELLAR_ENDPOINT: ${{vars.INSTELLAR_ENDPOINT}}
INSTELLAR_PACKAGE_TOKEN: ${{secrets.INSTELLAR_PACKAGE_TOKEN}}
INSTELLAR_AUTH_TOKEN: ${{secrets.INSTELLAR_AUTH_TOKEN}}
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ The build system for polar is called [icepak](https://github.com/upmaru/icepak).

## Demo

+ [Sandbox Site](https://images.opsmaru.dev)
+ [Production](https://images.opsmaru.com)
+ [Sandbox](https://images.opsmaru.dev)

## Basic Architecture

Expand Down
10 changes: 10 additions & 0 deletions config/config.exs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,16 @@ config :polar,
ecto_repos: [Polar.Repo],
generators: [timestamp_type: :utc_datetime]

config :polar, Polar.Vault, json_library: Jason

config :polar, Oban,
engine: Oban.Engines.Basic,
queues: [default: 3],
repo: Polar.Repo,
plugins: [
{Oban.Plugins.Cron, crontab: [{"@daily", Polar.Streams.Version.Pruning}]}
]

# Configures the endpoint
config :polar, PolarWeb.Endpoint,
url: [host: "localhost"],
Expand Down
15 changes: 15 additions & 0 deletions config/runtime.exs
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,21 @@ config :polar, Polar.Assets,
endpoint: System.get_env("AWS_S3_ENDPOINT"),
default_cdn_host: default_cdn_host

cloak_key =
System.get_env("CLOAK_KEY") || System.get_env("POLAR_CLOAK_KEY") ||
raise """
environment variable CLOAK_KEY or POLAR_CLOAK_KEY is missing.
You can generate one using 32 |> :crypto.strong_rand_bytes() |> Base.encode64()
"""

config :polar, Polar.Vault,
ciphers: [
default: {
Cloak.Ciphers.AES.GCM,
tag: "AES.GCM.V1", key: Base.decode64!(cloak_key)
}
]

if config_env() == :prod do
database_url =
System.get_env("DATABASE_URL") ||
Expand Down
4 changes: 4 additions & 0 deletions config/test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@ config :polar, PolarWeb.Endpoint,
secret_key_base: "6KFZ6zNwk0UXHww8AnEmReHHKixN5GmuKJLFVB+/YvfcvgVaKMwM3G4SvSNz5Z8s",
server: false

config :polar, Oban, testing: :manual

config :polar, :lexdee, Polar.LexdeeMock

# In test we don't send emails.
config :polar, Polar.Mailer, adapter: Swoosh.Adapters.Test

Expand Down
4 changes: 3 additions & 1 deletion instellar.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ build:
run:
commands:
- binary: polar
call: eval 'Polar.Release.migrate'
call: eval 'Polar.Release.Tasks.migrate'
name: migrate
- binary: polar
call: remote
Expand Down Expand Up @@ -81,4 +81,6 @@ kits:
driver: database/postgresql
key: DATABASE
- driver: bucket/aws-s3
driver_options:
acl: public
key: AWS_S3
8 changes: 6 additions & 2 deletions lib/polar/accounts/space/credential.ex
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ defmodule Polar.Accounts.Space.Credential do
import Ecto.Changeset

alias Polar.Accounts.Space
alias Polar.Streams.ReleaseChannel

alias __MODULE__.Transitions
alias __MODULE__.Event
Expand All @@ -27,11 +28,13 @@ defmodule Polar.Accounts.Space.Credential do
field :name, :string

field :token, :binary
field :type, :string
field :type, :string, default: "lxd"

field :expires_in, :integer, virtual: true
field :expires_at, :utc_datetime

field :release_channel, :string, default: "active"

belongs_to :space, Space

timestamps(type: :utc_datetime_usec)
Expand All @@ -46,12 +49,13 @@ defmodule Polar.Accounts.Space.Credential do
expires_in_range_values = Enum.map(@expires_in_range, fn r -> r.value end)

credential
|> cast(attrs, [:name, :expires_in, :type])
|> cast(attrs, [:name, :expires_in, :type, :release_channel])
|> generate_token()
|> validate_inclusion(:expires_in, expires_in_range_values)
|> validate_inclusion(:type, types())
|> maybe_set_expires_at()
|> validate_required([:token, :type, :name])
|> validate_inclusion(:release_channel, ReleaseChannel.valid_names())
|> unique_constraint(:name, name: :space_credentials_space_id_name_index)
end

Expand Down
2 changes: 2 additions & 0 deletions lib/polar/application.ex
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,12 @@ defmodule Polar.Application do
children = [
PolarWeb.Telemetry,
Polar.Repo,
{Oban, Application.fetch_env!(:polar, Oban)},
{DNSCluster, query: Application.get_env(:polar, :dns_cluster_query) || :ignore},
{Phoenix.PubSub, name: Polar.PubSub},
# Start the Finch HTTP client for sending emails
{Finch, name: Polar.Finch},
Polar.Vault,
# Start a worker by calling: Polar.Worker.start_link(arg)
# {Polar.Worker, arg},
# Start to serve requests, typically the last entry
Expand Down
3 changes: 3 additions & 0 deletions lib/polar/encrypted/map.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
defmodule Polar.Encrypted.Map do
use Cloak.Ecto.Map, vault: Polar.Vault
end
27 changes: 27 additions & 0 deletions lib/polar/machines.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
defmodule Polar.Machines do
alias __MODULE__.Cluster

defdelegate list_clusters(scope),
to: Cluster.Manager,
as: :list

defdelegate create_cluster(params),
to: Cluster.Manager,
as: :create

alias __MODULE__.Check

defdelegate list_checks(),
to: Check.Manager,
as: :list

defdelegate create_check(params),
to: Check.Manager,
as: :create

alias __MODULE__.Assessment

defdelegate get_or_create_assessment(version, params),
to: Assessment.Manager,
as: :get_or_create
end
49 changes: 49 additions & 0 deletions lib/polar/machines/assessment.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
defmodule Polar.Machines.Assessment do
use Ecto.Schema
import Ecto.Changeset

alias Polar.Streams
alias Polar.Machines.Check
alias Polar.Machines.Cluster

alias __MODULE__.Event
alias __MODULE__.Transitions

use Eventful.Transitable

Transitions
|> governs(:current_state, on: Event)

@valid_attrs ~w(
check_id
cluster_id
instance_type
)a

@required_attrs ~w(
check_id
cluster_id
instance_type
)a

schema "assessments" do
field :current_state, :string, default: "created"

field :instance_type, :string

belongs_to :check, Check
belongs_to :cluster, Cluster

belongs_to :version, Streams.Version

timestamps(type: :utc_datetime_usec)
end

@doc false
def changeset(assessment, attrs) do
assessment
|> cast(attrs, @valid_attrs)
|> validate_required(@required_attrs)
|> validate_inclusion(:instance_type, ["container", "vm"])
end
end
12 changes: 12 additions & 0 deletions lib/polar/machines/assessment/event.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
defmodule Polar.Machines.Assessment.Event do
alias Polar.Machines.Assessment
alias Polar.Accounts.User

use Eventful,
parent: {:assessment, Assessment},
actor: {:user, User}

alias Assessment.Transitions

handle(:transitions, using: Transitions)
end
29 changes: 29 additions & 0 deletions lib/polar/machines/assessment/manager.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
defmodule Polar.Machines.Assessment.Manager do
alias Polar.Repo
alias Polar.Machines.Assessment

def get_or_create(version, params) do
check_id = Map.get(params, "check_id") || params.check_id
instance_type = Map.get(params, "instance_type") || params.instance_type

Assessment
|> Repo.get_by(
version_id: version.id,
check_id: check_id,
instance_type: instance_type
)
|> case do
%Assessment{} = assessment ->
{:ok, assessment}

nil ->
create(version, params)
end
end

def create(version, params) do
%Assessment{version_id: version.id}
|> Assessment.changeset(params)
|> Repo.insert()
end
end
17 changes: 17 additions & 0 deletions lib/polar/machines/assessment/transit.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
defimpl Eventful.Transit, for: Polar.Machines.Assessment do
alias Polar.Machines.Assessment.Event

def perform(assessment, user, event_name, options \\ []) do
comment = Keyword.get(options, :comment)
domain = Keyword.get(options, :domain, "transitions")
parameters = Keyword.get(options, :parameters, %{})

assessment
|> Event.handle(user, %{
domain: domain,
name: event_name,
comment: comment,
parameters: parameters
})
end
end
36 changes: 36 additions & 0 deletions lib/polar/machines/assessment/transitions.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
defmodule Polar.Machines.Assessment.Transitions do
@behaviour Eventful.Handler
use Eventful.Transition, repo: Polar.Repo

alias Polar.Machines.Assessment

Assessment
|> transition(
[from: "created", to: "running", via: "run"],
fn changes -> transit(changes) end
)

Assessment
|> transition(
[from: "failed", to: "running", via: "run"],
fn changes -> transit(changes) end
)

Assessment
|> transition(
[from: "running", to: "running", via: "run"],
fn changes -> transit(changes) end
)

Assessment
|> transition(
[from: "running", to: "passed", via: "pass"],
fn changes -> transit(changes) end
)

Assessment
|> transition(
[from: "running", to: "failed", via: "fail"],
fn changes -> transit(changes) end
)
end
29 changes: 29 additions & 0 deletions lib/polar/machines/check.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
defmodule Polar.Machines.Check do
use Ecto.Schema
import Ecto.Changeset

schema "checks" do
field :name, :string, virtual: true

field :slug, :string
field :description, :string

timestamps(type: :utc_datetime_usec)
end

@doc false
def changeset(check, attrs) do
check
|> cast(attrs, [:name, :description])
|> validate_required([:name, :description])
|> generate_slug()
end

defp generate_slug(changeset) do
if name = get_change(changeset, :name) do
put_change(changeset, :slug, Slug.slugify(name))
else
changeset
end
end
end
14 changes: 14 additions & 0 deletions lib/polar/machines/check/manager.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
defmodule Polar.Machines.Check.Manager do
alias Polar.Repo
alias Polar.Machines.Check

def list() do
Repo.all(Check)
end

def create(params) do
%Check{}
|> Check.changeset(params)
|> Repo.insert()
end
end
Loading

0 comments on commit efd717b

Please sign in to comment.