@@ -4,121 +4,40 @@ import { shuffle } from "../util/utility";
44
55const projectId = config . GOOGLE_CLOUD_PROJECT_ID ;
66const lifetime = 600 ;
7- // const template = 'retriever-20 ';
7+ const template = 'retriever-20250324 ' ;
88
99async function getToken ( ) {
10- const tokenResponse = await axios . get ( "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" , { headers : { "Metadata-Flavor" : "Google" } } ) ;
11- const token = tokenResponse . data . access_token ;
12- return token ;
10+ const tokenResponse = await axios . get ( "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" , { headers : { "Metadata-Flavor" : "Google" } } ) ;
11+ const token = tokenResponse . data . access_token ;
12+ return token ;
1313}
1414
1515async function cycle ( ) {
16+ while ( true ) {
1617 const zonesResponse = await axios . get ( `https://compute.googleapis.com/compute/v1/projects/${ projectId } /zones` , { headers : { "Authorization" : "Bearer " + await getToken ( ) } } ) ;
1718 const zones = zonesResponse . data . items . map ( ( zone : any ) => zone . name ) ;
1819 console . log ( zones , zones . length ) ;
19- while ( true ) {
20- shuffle ( zones ) ;
21- for ( let i = 0 ; i < 3 ; i ++ ) {
22- const zone = zones [ i % zones . length ] ;
23- const region = zone . slice ( 0 , - 2 ) ;
24- const config = {
25- "canIpForward" : false ,
26- "confidentialInstanceConfig" : {
27- "enableConfidentialCompute" : false
28- } ,
29- "deletionProtection" : false ,
30- "description" : "" ,
31- "disks" : [
32- {
33- "autoDelete" : true ,
34- "boot" : true ,
35- "deviceName" : "retriever-14" ,
36- "initializeParams" : {
37- "diskSizeGb" : "10" ,
38- "diskType" : `projects/${ projectId } /zones/${ zone } /diskTypes/pd-standard` ,
39- "labels" : { } ,
40- "sourceImage" : "projects/cos-cloud/global/images/cos-101-17162-336-35"
41- } ,
42- "mode" : "READ_WRITE" ,
43- "type" : "PERSISTENT"
44- }
45- ] ,
46- "displayDevice" : {
47- "enableDisplay" : false
48- } ,
49- "guestAccelerators" : [ ] ,
50- "instanceEncryptionKey" : { } ,
51- "keyRevocationActionType" : "NONE" ,
52- "labels" : {
53- "goog-ec-src" : "vm_add-rest"
54- } ,
55- "machineType" : `projects/${ projectId } /zones/${ zone } /machineTypes/e2-micro` ,
56- "metadata" : {
57- "items" : [
58- {
59- "key" : "startup-script" ,
60- "value" : "#!/bin/bash\nsudo iptables -w -A INPUT -p tcp --dport 80 -j ACCEPT\n\n# Secrets don't need to be set since they're read from GCE metadata\nsudo docker run -d --name=retriever --net=host --log-opt max-size=1g -e PROVIDER=gce -e NODE_ENV=production -e RETRIEVER_PORT=80 -e ROLE=retriever odota/retriever:latest\n\n# If already initialized\nsudo docker start retriever\n\n# We can set a time limit for termination on GCE, but it's cancelled if we shut down manually\nsudo docker logs -f retriever\n# && sleep 5 && sudo shutdown -h now"
61- }
62- ]
63- } ,
64- "name" : "retriever-" + process . hrtime . bigint ( ) ,
65- "networkInterfaces" : [
66- {
67- "accessConfigs" : [
68- {
69- "name" : "External NAT" ,
70- "networkTier" : "PREMIUM"
71- }
72- ] ,
73- "stackType" : "IPV4_ONLY" ,
74- "subnetwork" : `projects/${ projectId } /regions/${ region } /subnetworks/global`
75- }
76- ] ,
77- "params" : {
78- "resourceManagerTags" : { }
79- } ,
80- "reservationAffinity" : {
81- "consumeReservationType" : "ANY_RESERVATION"
82- } ,
83- "scheduling" : {
84- "automaticRestart" : false ,
85- "instanceTerminationAction" : "DELETE" ,
86- "maxRunDuration" : {
87- "seconds" : lifetime . toString ( ) ,
88- } ,
89- "onHostMaintenance" : "TERMINATE" ,
90- "provisioningModel" : "SPOT"
91- } ,
92- "serviceAccounts" : [
93- {
94- 95- "scopes" : [
96- "https://www.googleapis.com/auth/devstorage.read_only" ,
97- "https://www.googleapis.com/auth/logging.write" ,
98- "https://www.googleapis.com/auth/monitoring.write" ,
99- "https://www.googleapis.com/auth/service.management.readonly" ,
100- "https://www.googleapis.com/auth/servicecontrol" ,
101- "https://www.googleapis.com/auth/trace.append"
102- ]
103- }
104- ] ,
105- "shieldedInstanceConfig" : {
106- "enableIntegrityMonitoring" : true ,
107- "enableSecureBoot" : false ,
108- "enableVtpm" : true
109- } ,
110- "tags" : {
111- "items" : [
112- "http-server"
113- ]
114- } ,
115- "zone" : `projects/${ projectId } /zones/` + zone ,
116- } ;
117- const resp = await axios . post ( `https://compute.googleapis.com/compute/v1/projects/${ projectId } /zones/${ zone } /instances` , config , { headers : { "Authorization" : "Bearer " + await getToken ( ) } } ) ;
118- console . log ( resp . data ) ;
119- }
120- await new Promise ( resolve => setTimeout ( resolve , lifetime * 1000 * 0.95 ) ) ;
20+ shuffle ( zones ) ;
21+ for ( let i = 0 ; i < 3 ; i ++ ) {
22+ const zone = zones [ i % zones . length ] ;
23+ const config = {
24+ "name" : "retriever-" + process . hrtime . bigint ( ) ,
25+ "scheduling" : {
26+ "automaticRestart" : false ,
27+ "instanceTerminationAction" : "DELETE" ,
28+ "maxRunDuration" : {
29+ "seconds" : lifetime . toString ( ) ,
30+ } ,
31+ "onHostMaintenance" : "TERMINATE" ,
32+ "provisioningModel" : "SPOT"
33+ } ,
34+ "zone" : `projects/${ projectId } /zones/` + zone ,
35+ } ;
36+ const resp = await axios . post ( `https://compute.googleapis.com/compute/v1/projects/${ projectId } /zones/${ zone } /instances?sourceInstanceTemplate=global/instanceTemplates/${ template } ` , config , { headers : { "Authorization" : "Bearer " + await getToken ( ) } } ) ;
37+ console . log ( resp . data ) ;
12138 }
39+ await new Promise ( resolve => setTimeout ( resolve , ( lifetime - 45 ) * 1000 ) ) ;
40+ }
12241}
12342
12443cycle ( ) ;
0 commit comments