1import * as GCP from "@/GCP";
2import * as Effect from "effect/Effect";
3import { serveProbes } from "../../bindingHost.ts";
4
5export const location = "us-central1";
6
7const SSH_KEY =
8 "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl alchemy-test";
9
10export const OracleNet = GCP.OracleDatabase.OdbNetwork("OracleNet", {
11 location,
12 network: "default",
13 labels: { env: "test" },
14});
15
16export const Client = Effect.gen(function* () {
17 const network = yield* OracleNet;
18 return yield* GCP.OracleDatabase.OdbNetworksOdbSubnet("Client", {
19 odbNetwork: network.name,
20 location,
21 cidrRange: "10.250.0.0/27",
22 purpose: "CLIENT_SUBNET",
23 labels: { env: "test" },
24 });
25});
26
27export const Backup = Effect.gen(function* () {
28 const network = yield* OracleNet;
29 return yield* GCP.OracleDatabase.OdbNetworksOdbSubnet("Backup", {
30 odbNetwork: network.name,
31 location,
32 cidrRange: "10.250.0.32/28",
33 purpose: "BACKUP_SUBNET",
34 labels: { env: "test" },
35 });
36});
37
38export const AppDb = GCP.OracleDatabase.AutonomousDatabase("AppDb", {
39 location,
40 network: "default",
41 cidr: "10.10.0.0/24",
42 adminPassword: "AlchemyTest1!",
43 displayName: "alchemy-bind-adb",
44 labels: { env: "test" },
45 licenseType: "LICENSE_INCLUDED",
46 dbWorkload: "OLTP",
47 cpuCoreCount: 2,
48 dataStorageSizeGb: 20,
49});
50
51export const Exa = GCP.OracleDatabase.CloudExadataInfrastructure("Exa", {
52 displayName: "alchemy-bind-exa",
53 shape: "Exadata.X9M",
54 computeCount: 2,
55 storageCount: 3,
56});
57
58export const Vms = Effect.gen(function* () {
59 const infra = yield* Exa;
60 return yield* GCP.OracleDatabase.CloudVmCluster("Vms", {
61 location,
62 exadataInfrastructure: infra.name,
63 network: "default",
64 cidr: "10.12.0.0/24",
65 backupSubnetCidr: "10.12.1.0/24",
66 licenseType: "LICENSE_INCLUDED",
67 cpuCoreCount: 4,
68 giVersion: "19.0.0.0",
69 hostnamePrefix: "exa",
70 sshPublicKeys: [SSH_KEY],
71 labels: { env: "test" },
72 });
73});
74
75export const BaseDb = Effect.gen(function* () {
76 const subnet = yield* Client;
77 return yield* GCP.OracleDatabase.DbSystem("BaseDb", {
78 location,
79 displayName: "alchemy-bind-dbsystem",
80 odbSubnet: subnet.name,
81 shape: "VM.Standard.E4.Flex",
82 sshPublicKeys: [SSH_KEY],
83 computeCount: 2,
84 initialDataStorageSizeGb: 256,
85 licenseModel: "LICENSE_INCLUDED",
86 databaseEdition: "ENTERPRISE_EDITION",
87 labels: { env: "test" },
88 });
89});
90
91export const Vault = GCP.OracleDatabase.ExascaleDbStorageVault("Vault", {
92 displayName: "alchemyvault",
93 totalSizeGbs: 300,
94});
95
96export const ExaVm = Effect.gen(function* () {
97 const vault = yield* Vault;
98 const subnet = yield* Client;
99 const backup = yield* Backup;
100 return yield* GCP.OracleDatabase.ExadbVmCluster("ExaVm", {
101 location,
102 displayName: "alchemyexavm",
103 odbSubnet: subnet.name,
104 backupOdbSubnet: backup.name,
105 gridImageId: "19.0.0.0",
106 hostnamePrefix: "exavm",
107 sshPublicKeys: [SSH_KEY],
108 exascaleDbStorageVault: vault.name,
109 enabledEcpuCountPerNode: 8,
110 nodeCount: 2,
111 properties: {
112 vmFileSystemStorage: { sizeInGbsPerNode: 180 },
113 shapeAttribute: "SMART_STORAGE",
114 },
115 });
116});
117
118export const Src = GCP.OracleDatabase.GoldengateConnection("Src", {
119 location,
120 connectionType: "GENERIC",
121 displayName: "alchemy-gg-src",
122 properties: {
123 genericConnectionProperties: {
124 host: "db.example.com",
125 technologyType: "GENERIC",
126 },
127 },
128});
129
130export const Replicat = Effect.gen(function* () {
131 const network = yield* OracleNet;
132 const subnet = yield* Client;
133 return yield* GCP.OracleDatabase.GoldengateDeployment("Replicat", {
134 location,
135 odbNetwork: network.name,
136 odbSubnet: subnet.name,
137 displayName: "alchemy-gg",
138 deploymentType: "DATABASE_ORACLE",
139 oggData: {
140 adminUsername: "oggadmin",
141 deployment: "oggdeploy",
142 adminPassword: "AlchemyTest1!",
143 },
144 labels: { env: "test" },
145 });
146});
147
148export const Assign = Effect.gen(function* () {
149 const connection = yield* Src;
150 const deployment = yield* Replicat;
151 return yield* GCP.OracleDatabase.GoldengateConnectionAssignment("Assign", {
152 location,
153 displayName: "alchemy-gg-assign",
154 goldengateConnection: connection.name,
155 goldengateDeployment: deployment.name,
156 labels: { env: "test" },
157 });
158});
159
160/** Wallet password the `generateWallet` probe uses. */
161export const WALLET_PASSWORD = "AlchemyTest1!";
162
163/**
164 * Effect-native Cloud Run service exercising every Oracle Database@Google
165 * Cloud binding as its own runtime service account. Deployed from
166 * {@link ../Bindings.test.ts} (only with GCP_TEST_ORACLE).
167 */
168export default class OracleBindingsHost extends GCP.Function<OracleBindingsHost>()(
169 "OracleBindingsHost",
170 { main: import.meta.url, invokerIamDisabled: true },
171 Effect.gen(function* () {
172 const db = yield* AppDb;
173 const getNetwork = yield* GCP.OracleDatabase.GetOdbNetwork(
174 yield* OracleNet,
175 );
176 const getSubnet = yield* GCP.OracleDatabase.GetOdbNetworksOdbSubnet(
177 yield* Client,
178 );
179 const getDb = yield* GCP.OracleDatabase.GetAutonomousDatabase(db);
180 const generateWallet = yield* GCP.OracleDatabase.GenerateWallet(db);
181 const start = yield* GCP.OracleDatabase.StartAutonomousDatabase(db);
182 const stop = yield* GCP.OracleDatabase.StopAutonomousDatabase(db);
183 const restart = yield* GCP.OracleDatabase.RestartAutonomousDatabase(db);
184 const getInfra = yield* GCP.OracleDatabase.GetCloudExadataInfrastructure(
185 yield* Exa,
186 );
187 const getVmCluster = yield* GCP.OracleDatabase.GetCloudVmCluster(
188 yield* Vms,
189 );
190 const getDbSystem = yield* GCP.OracleDatabase.GetDbSystem(yield* BaseDb);
191 const getVault = yield* GCP.OracleDatabase.GetExascaleDbStorageVault(
192 yield* Vault,
193 );
194 const getExadb = yield* GCP.OracleDatabase.GetExadbVmCluster(yield* ExaVm);
195 const getConnection = yield* GCP.OracleDatabase.GetGoldengateConnection(
196 yield* Src,
197 );
198 const getDeployment = yield* GCP.OracleDatabase.GetGoldengateDeployment(
199 yield* Replicat,
200 );
201 const getAssignment =
202 yield* GCP.OracleDatabase.GetGoldengateConnectionAssignment(
203 yield* Assign,
204 );
205
206 return {
207 fetch: serveProbes({
208 getOdbNetwork: getNetwork(),
209 getOdbNetworksOdbSubnet: getSubnet(),
210 getAutonomousDatabase: getDb(),
211 generateWallet: generateWallet({
212 body: { password: WALLET_PASSWORD, type: "SINGLE" },
213 }),
214 stopAutonomousDatabase: stop(),
215 startAutonomousDatabase: start(),
216 restartAutonomousDatabase: restart(),
217 getCloudExadataInfrastructure: getInfra(),
218 getCloudVmCluster: getVmCluster(),
219 getDbSystem: getDbSystem(),
220 getExascaleDbStorageVault: getVault(),
221 getExadbVmCluster: getExadb(),
222 getGoldengateConnection: getConnection(),
223 getGoldengateDeployment: getDeployment(),
224 getGoldengateConnectionAssignment: getAssignment(),
225 }),
226 };
227 }).pipe(
228 Effect.provide(GCP.OracleDatabase.GetOdbNetworkHttp),
229 Effect.provide(GCP.OracleDatabase.GetOdbNetworksOdbSubnetHttp),
230 Effect.provide(GCP.OracleDatabase.GetAutonomousDatabaseHttp),
231 Effect.provide(GCP.OracleDatabase.GenerateWalletHttp),
232 Effect.provide(GCP.OracleDatabase.StartAutonomousDatabaseHttp),
233 Effect.provide(GCP.OracleDatabase.StopAutonomousDatabaseHttp),
234 Effect.provide(GCP.OracleDatabase.RestartAutonomousDatabaseHttp),
235 Effect.provide(GCP.OracleDatabase.GetCloudExadataInfrastructureHttp),
236 Effect.provide(GCP.OracleDatabase.GetCloudVmClusterHttp),
237 Effect.provide(GCP.OracleDatabase.GetDbSystemHttp),
238 Effect.provide(GCP.OracleDatabase.GetExascaleDbStorageVaultHttp),
239 Effect.provide(GCP.OracleDatabase.GetExadbVmClusterHttp),
240 Effect.provide(GCP.OracleDatabase.GetGoldengateConnectionHttp),
241 Effect.provide(GCP.OracleDatabase.GetGoldengateDeploymentHttp),
242 Effect.provide(GCP.OracleDatabase.GetGoldengateConnectionAssignmentHttp),
243 ),
244) {}