Skip to content
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
4 changes: 4 additions & 0 deletions .github/workflows/celest_cloud_hub.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,13 @@ jobs:
uses: subosito/flutter-action@e938fdf56512cc96ef2f93601a5a40bde3801046 # 2.19.0
with:
cache: true
- name: Setup Fly
uses: superfly/flyctl-actions/setup-flyctl@63da3ecc5e2793b98a3f2519b3d75d4f4c11cec2 # master
- name: Get Packages
working-directory: services/celest_cloud_hub
run: dart pub upgrade
- name: Test
working-directory: services/celest_cloud_hub
run: dart test --fail-fast -j1
env:
FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }}
14 changes: 14 additions & 0 deletions services/celest_cloud_core/lib/src/model/resource_name.dart
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,17 @@ extension type ResourceName(_ResourceNameInfo _info) {
));
}

/// Tries to parse a resource name string into a [ResourceName] object.
///
/// Returns `null` if the parsing fails for any reason.
static ResourceName? tryParse(String name) {
try {
return ResourceName.parse(name);
} on Object {
return null;
}
}

/// A map of resource pattern types to their Cedar entity types.
static const Map<String, EntityTypeName> entityTypes = {
'operations': EntityTypeName('Celest::Operation'),
Expand All @@ -55,6 +66,9 @@ extension type ResourceName(_ResourceNameInfo _info) {
/// The resource type for this resource.
ResourceType get type => _info.type;

/// The identifier of this resource.
String get id => uid.id;

/// The unique identifier for this resource.
EntityUid get uid => _info.uid;

Expand Down
16 changes: 16 additions & 0 deletions services/celest_cloud_hub/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
lib/src/database/schema/*.drift.dart: lib/src/database/schema/*.drift
@echo "Generating Drift code..."
@dart run build_runner build --delete-conflicting-outputs

lib/src/database/cloud_hub_database.steps.dart: lib/src/database/cloud_hub_database.dart lib/src/database/schema/*.drift.dart
@echo "Generating migration steps..."
@dart run drift_dev make-migrations

drift: lib/src/database/cloud_hub_database.steps.dart

cedar: lib/src/auth/*.cedar
@echo "Generating Cedar code..."
@dart run tool/generate_policy_set.dart

.PHONY: drift cedar
all: drift cedar
138 changes: 0 additions & 138 deletions services/celest_cloud_hub/bin/deploy_test.dart

This file was deleted.

5 changes: 5 additions & 0 deletions services/celest_cloud_hub/build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,11 @@ targets:
- lib/src/database/**
- lib/src/model/**
options: &options
databases:
cloud_hub_database: lib/src/database/cloud_hub_database.dart
schema_dir: drift_schema/
test_dir: test/database/

sql:
dialect: sqlite
options:
Expand Down
3 changes: 3 additions & 0 deletions services/celest_cloud_hub/dart_test.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
tags:
e2e:
timeout: 5m

Large diffs are not rendered by default.

Large diffs are not rendered by default.

26 changes: 26 additions & 0 deletions services/celest_cloud_hub/lib/src/context.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import 'package:celest/src/config/config_values.dart';
import 'package:celest/src/core/context.dart' as core;
import 'package:celest_cloud_hub/src/deploy/fly/fly_api.dart';

export 'package:celest/src/core/context.dart' show ContextKey;

Context get context => Context._(core.Context.current);

extension type Context._(core.Context _ctx) implements core.Context {
static const core.ContextKey<FlyMachinesApiClient> _flyContextKey =
core.ContextKey<FlyMachinesApiClient>('FlyMachinesApiClient');

String get flyAuthToken => _ctx.expect(const env('FLY_API_TOKEN'));
String get flyOrgSlug => 'celest-809';

FlyMachinesApiClient get fly {
if (_ctx.get(_flyContextKey) case final flyApi?) {
return flyApi;
}
final flyApi = FlyMachinesApiClient(
authToken: flyAuthToken,
client: _ctx.httpClient,
);
return _ctx.put(_flyContextKey, flyApi);
}
}
62 changes: 29 additions & 33 deletions services/celest_cloud_hub/lib/src/database/cloud_hub_database.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'dart:io';

import 'package:celest_cloud_auth/celest_cloud_auth.dart';
import 'package:celest_cloud_hub/src/auth/policy_set.g.dart';
import 'package:celest_cloud_hub/src/database/cloud_hub_database.steps.dart';
import 'package:celest_cloud_hub/src/database/db_functions.dart';
import 'package:celest_cloud_hub/src/project.dart';
import 'package:celest_cloud_hub/src/services/service_mixin.dart';
Expand Down Expand Up @@ -44,7 +45,7 @@ final class CloudHubDatabase extends $CloudHubDatabase
}

@override
int get schemaVersion => 1;
int get schemaVersion => 2;

static final Entity rootOrg = Entity(
uid: const EntityUid.of('Celest::Organization', 'celest-dev'),
Expand All @@ -53,44 +54,39 @@ final class CloudHubDatabase extends $CloudHubDatabase
static final Logger _logger = Logger('CloudHubDatabase');

@override
MigrationStrategy get migration => MigrationStrategy(
onCreate: (m) async {
await m.createAll();
},
onUpgrade: (m, from, to) async {
await cloudAuth.onUpgrade(m);
},
MigrationStrategy get migration => createMigration(
onUpgrade: stepByStep(
from1To2: (m, schema) async {
await m.addColumn(
schema.projectEnvironmentStates,
schema.projectEnvironmentStates.flyVolumeId,
);
},
),
beforeOpen: (details) async {
final versionRow =
await customSelect('SELECT sqlite_version() as version;').getSingle();
final version = versionRow.read<String>('version');
_logger.config('Using SQLite v$version');

await withoutForeignKeys(() async {
if (details.wasCreated) {
await cloudAuth.seed(
additionalCedarTypes: {
'Celest::Operation',
'Celest::Organization',
'Celest::Organization::Member',
'Celest::Project',
'Celest::Project::Member',
'Celest::Project::Environment',
'Celest::Project::Environment::Member',
},
additionalCedarEntities: {
rootOrg.uid: rootOrg,
ProjectEnvironmentAction.deploy: Entity(
uid: ProjectEnvironmentAction.deploy,
parents: [CelestAction.owner],
),
},
additionalCedarPolicies: corePolicySet,
);
}
await cloudAuth.upsertProject(project: project);
});
},
project: project,
additionalCedarTypes: {
'Celest::Operation',
'Celest::Organization',
'Celest::Organization::Member',
'Celest::Project',
'Celest::Project::Member',
'Celest::Project::Environment',
'Celest::Project::Environment::Member',
},
additionalCedarEntities: {
rootOrg.uid: rootOrg,
ProjectEnvironmentAction.deploy: Entity(
uid: ProjectEnvironmentAction.deploy,
parents: [CelestAction.owner],
),
},
additionalCedarPolicies: corePolicySet,
);

/// Runs [action] in a context without foreign keys enabled.
Expand Down
Loading