| 1 | package registry |
| 2 | |
| 3 | import ( |
| 4 | "context" |
| 5 | "encoding/json" |
| 6 | ) |
| 7 | |
| 8 | type remoteRequest struct { |
| 9 | Method string |
| 10 | Deadline int64 |
| 11 | CallbackError string |
| 12 | CallbackFailed bool |
| 13 | Host string |
| 14 | Owner ClaimOwnership |
| 15 | Expected string |
| 16 | Next string |
| 17 | Observed Route |
| 18 | Journal string |
| 19 | Targets []ClaimRow |
| 20 | ObservedValue Timer |
| 21 | T Timer |
| 22 | Name string |
| 23 | Registration string |
| 24 | Status string |
| 25 | Now int64 |
| 26 | Id string |
| 27 | Retirement string |
| 28 | Old ColdRows |
| 29 | NextValue ColdRows |
| 30 | F Fleet |
| 31 | B FleetBox |
| 32 | Fleet string |
| 33 | Label string |
| 34 | TokenHash string |
| 35 | Tags string |
| 36 | IdValue int64 |
| 37 | Sqid string |
| 38 | TValue Route |
| 39 | Op string |
| 40 | ExpectOp string |
| 41 | ToOp string |
| 42 | FromOp string |
| 43 | Account string |
| 44 | Channel string |
| 45 | From string |
| 46 | To string |
| 47 | FromDB string |
| 48 | FromSock string |
| 49 | ToDB string |
| 50 | ToSock string |
| 51 | Backing string |
| 52 | Unit string |
| 53 | Class string |
| 54 | Addr string |
| 55 | Addrs string |
| 56 | Health string |
| 57 | Steering string |
| 58 | UpdateSettings string |
| 59 | BuildState string |
| 60 | Replicas string |
| 61 | Replica bool |
| 62 | Hash string |
| 63 | Hosts []string |
| 64 | Env string |
| 65 | Tunnel string |
| 66 | Target string |
| 67 | CheckedAt int64 |
| 68 | At int64 |
| 69 | Ver string |
| 70 | Prev string |
| 71 | On bool |
| 72 | Due int64 |
| 73 | Seed string |
| 74 | Args string |
| 75 | Idle int |
| 76 | MaxRun int |
| 77 | A RouteAlias |
| 78 | Alias string |
| 79 | W WildcardDomain |
| 80 | P RoutePath |
| 81 | Prefix string |
| 82 | Path string |
| 83 | Rows []Timer |
| 84 | Limit int |
| 85 | ExcludeHosts []string |
| 86 | Ms int64 |
| 87 | Attempts int |
| 88 | NextAt int64 |
| 89 | Kind string |
| 90 | Alive map[string]bool |
| 91 | DoneBefore int64 |
| 92 | Keep map[string]bool |
| 93 | ExpectGood GoodBuild |
| 94 | NextGood GoodBuild |
| 95 | } |
| 96 | |
| 97 | type remoteResponse struct { |
| 98 | Failed bool |
| 99 | Error string |
| 100 | ErrorKind int |
| 101 | Callback string |
| 102 | Held []Route |
| 103 | Archives []ClaimRowArchive |
| 104 | Timer *Timer |
| 105 | Changed bool |
| 106 | Fleet *Fleet |
| 107 | Fleets []Fleet |
| 108 | FleetBoxes []FleetBox |
| 109 | StringMap map[string]string |
| 110 | Number64 int64 |
| 111 | Text string |
| 112 | Accounts []Account |
| 113 | Routes []Route |
| 114 | Route *Route |
| 115 | Aliases []RouteAlias |
| 116 | Wildcards []WildcardDomain |
| 117 | Paths []RoutePath |
| 118 | Timers []Timer |
| 119 | Number int |
| 120 | Times map[string]int64 |
| 121 | Hosts []string |
| 122 | } |
| 123 | |
| 124 | func (r *Registry) dispatchRemote(ctx context.Context, q remoteRequest, callback func(remoteResponse) error) (out remoteResponse, err error) { |
| 125 | switch q.Method { |
| 126 | case "ArtifactHosts": |
| 127 | out.Hosts, err = r.ArtifactHosts() |
| 128 | case "SetClaimHold": |
| 129 | err = r.SetClaimHold(ctx, q.Host, q.Owner, q.Expected, q.Next) |
| 130 | case "AdoptClaimRoute": |
| 131 | err = r.AdoptClaimRoute(ctx, q.Observed, q.Owner) |
| 132 | case "RetireClaimRows": |
| 133 | err = r.RetireClaimRows(ctx, q.Journal, q.Targets, func(archives []ClaimRowArchive) error { |
| 134 | return callback(remoteResponse{Callback: "archives", Archives: archives}) |
| 135 | }) |
| 136 | case "AdoptClaimTimer": |
| 137 | err = r.AdoptClaimTimer(ctx, q.ObservedValue, q.Owner) |
| 138 | case "MaterializeTimerRegistration": |
| 139 | out.Timer, err = r.MaterializeTimerRegistration(q.T, q.Expected) |
| 140 | case "DeleteTimerOwnedRegistration": |
| 141 | err = r.DeleteTimerOwnedRegistration(q.T) |
| 142 | case "UpsertTimerRegistration": |
| 143 | out.Timer, err = r.UpsertTimerRegistration(q.T, q.Expected) |
| 144 | case "SetTimerStatusRegistration": |
| 145 | err = r.SetTimerStatusRegistration(q.Host, q.Name, q.Registration, q.Status) |
| 146 | case "FireTimerNowRegistration": |
| 147 | err = r.FireTimerNowRegistration(q.Host, q.Name, q.Registration, q.Now) |
| 148 | case "ReviseRecoveryHandover": |
| 149 | err = r.ReviseRecoveryHandover(ctx, q.Id, q.Expected, q.Journal) |
| 150 | case "PendingRecoveryHandovers": |
| 151 | var bodies map[string]string |
| 152 | bodies, err = r.PendingRecoveryHandovers(ctx) |
| 153 | if err == nil { |
| 154 | var raw []byte |
| 155 | raw, err = json.Marshal(bodies) |
| 156 | out.Text = string(raw) |
| 157 | } |
| 158 | case "BeginRecoveryHandover": |
| 159 | err = r.BeginRecoveryHandover(ctx, q.Id, q.Journal) |
| 160 | case "PendingRecoveryHandover": |
| 161 | out.Text, err = r.PendingRecoveryHandover(ctx, q.Id) |
| 162 | case "CompleteRecoveryHandover": |
| 163 | err = r.CompleteRecoveryHandover(ctx, q.Id, q.Journal) |
| 164 | case "RebindClaimRows": |
| 165 | err = r.RebindClaimRows(ctx, q.Old, q.NextValue) |
| 166 | case "RestoreClaimRows": |
| 167 | err = r.RestoreClaimRows(ctx, q.Id, q.Retirement, q.Old, q.NextValue) |
| 168 | case "UpsertFleet": |
| 169 | err = r.UpsertFleet(q.F) |
| 170 | case "CreateFleet": |
| 171 | out.Changed, err = r.CreateFleet(q.F) |
| 172 | case "GetFleet": |
| 173 | out.Fleet, err = r.GetFleet(q.Name) |
| 174 | case "ListFleets": |
| 175 | out.Fleets, err = r.ListFleets() |
| 176 | case "AddFleetBox": |
| 177 | err = r.AddFleetBox(q.B) |
| 178 | case "SetFleetBoxToken": |
| 179 | err = r.SetFleetBoxToken(q.Fleet, q.Label, q.TokenHash) |
| 180 | case "SetFleetBoxTags": |
| 181 | err = r.SetFleetBoxTags(q.Fleet, q.Label, q.Tags) |
| 182 | case "SetFleetBoxStatus": |
| 183 | err = r.SetFleetBoxStatus(q.Fleet, q.Label, q.Status) |
| 184 | case "ListFleetBoxes": |
| 185 | out.FleetBoxes, err = r.ListFleetBoxes(q.Fleet) |
| 186 | case "FleetChannelAuth": |
| 187 | out.StringMap, err = r.FleetChannelAuth() |
| 188 | case "PutAccount": |
| 189 | err = r.PutAccount(q.IdValue, q.Sqid, q.Name) |
| 190 | case "DeleteAccount": |
| 191 | err = r.DeleteAccount(q.Sqid) |
| 192 | case "AccountBySqid": |
| 193 | out.Number64, out.Text, err = r.AccountBySqid(q.Sqid) |
| 194 | case "Accounts": |
| 195 | out.Accounts, err = r.Accounts() |
| 196 | case "ImportJournalHosts": |
| 197 | out.Hosts, err = r.ImportJournalHosts() |
| 198 | case "List": |
| 199 | out.Routes, err = r.List() |
| 200 | case "Get": |
| 201 | out.Route, err = r.Get(q.Host) |
| 202 | case "Delete": |
| 203 | err = r.Delete(q.Host) |
| 204 | case "Upsert": |
| 205 | err = r.Upsert(q.TValue) |
| 206 | case "SetHold": |
| 207 | err = r.SetHold(q.Host, q.Status, q.Op) |
| 208 | case "SetHoldIf": |
| 209 | out.Changed, err = r.SetHoldIf(q.Host, q.Status, q.Op, q.ExpectOp) |
| 210 | case "HandHold": |
| 211 | out.Changed, err = r.HandHold(q.Host, q.Status, q.ToOp, q.FromOp) |
| 212 | case "ReleaseHold": |
| 213 | out.Changed, err = r.ReleaseHold(q.Host, q.Op) |
| 214 | case "DeleteIfHold": |
| 215 | out.Changed, err = r.DeleteIfHold(q.Host, q.Op) |
| 216 | case "DeleteIfHoldWithTimers": |
| 217 | out.Changed, err = r.DeleteIfHoldWithTimers(q.Host, q.Op) |
| 218 | case "HoldRows": |
| 219 | out.Routes, err = r.HoldRows() |
| 220 | case "WithHoldsFrozen": |
| 221 | err = r.WithHoldsFrozen(func(held []Route) error { return callback(remoteResponse{Callback: "holds", Held: held}) }) |
| 222 | case "SetAccount": |
| 223 | err = r.SetAccount(q.Host, q.Account) |
| 224 | case "SetChannel": |
| 225 | err = r.SetChannel(q.Host, q.Channel) |
| 226 | case "SetStatus": |
| 227 | err = r.SetStatus(q.Host, q.Status) |
| 228 | case "SetCaps": |
| 229 | err = r.SetCaps(q.Host, q.From, q.To) |
| 230 | case "SetDBPath": |
| 231 | err = r.SetDBPath(q.Host, q.From, q.To) |
| 232 | case "SetInstancePaths": |
| 233 | err = r.SetInstancePaths(q.Host, q.FromDB, q.FromSock, q.ToDB, q.ToSock) |
| 234 | case "SetBacking": |
| 235 | err = r.SetBacking(q.Host, q.Backing) |
| 236 | case "SetUnit": |
| 237 | err = r.SetUnit(q.Host, q.Unit) |
| 238 | case "SetReplication": |
| 239 | err = r.SetReplication(q.Host, q.Class) |
| 240 | case "SetUpstreams": |
| 241 | err = r.SetUpstreams(q.Host, q.Addr, q.Addrs, q.Health) |
| 242 | case "SetSteering": |
| 243 | err = r.SetSteering(q.Host, q.Steering) |
| 244 | case "SetUpdateSettings": |
| 245 | err = r.SetUpdateSettings(q.Host, q.UpdateSettings) |
| 246 | case "SetBuildState": |
| 247 | err = r.SetBuildState(q.Host, q.BuildState) |
| 248 | case "SetReplicas": |
| 249 | err = r.SetReplicas(q.Host, q.Replicas) |
| 250 | case "SetReplica": |
| 251 | err = r.SetReplica(q.Host, q.Replica) |
| 252 | case "SetGate": |
| 253 | err = r.SetGate(q.Host, q.Hash) |
| 254 | case "SetChannels": |
| 255 | err = r.SetChannels(q.Hosts, q.Channel) |
| 256 | case "SetEnvironment": |
| 257 | err = r.SetEnvironment(q.Host, q.Env) |
| 258 | case "SetTunnel": |
| 259 | err = r.SetTunnel(q.Host, q.Tunnel) |
| 260 | case "SetFleetBox": |
| 261 | err = r.SetFleetBox(q.Host, q.Label) |
| 262 | case "SetPlacement": |
| 263 | err = r.SetPlacement(q.Host, q.Target) |
| 264 | case "SetEnvironments": |
| 265 | err = r.SetEnvironments(q.Hosts, q.Env) |
| 266 | case "SetChannelsAndEnvironments": |
| 267 | err = r.SetChannelsAndEnvironments(q.Hosts, q.Channel, q.Env) |
| 268 | case "SetDNSStatus": |
| 269 | err = r.SetDNSStatus(q.Host, q.Status, q.CheckedAt) |
| 270 | case "SetCertExpiresAt": |
| 271 | err = r.SetCertExpiresAt(q.Host, q.At) |
| 272 | case "SetVersions": |
| 273 | err = r.SetVersions(q.Host, q.Ver, q.Prev) |
| 274 | case "SetGoodBuild": |
| 275 | err = r.SetGoodBuild(q.Host, q.ExpectGood, q.NextGood) |
| 276 | case "SetServingVersion": |
| 277 | err = r.SetServingVersion(q.Host, q.Ver) |
| 278 | case "SetHibernate": |
| 279 | err = r.SetHibernate(q.Host, q.On) |
| 280 | case "SetNextDue": |
| 281 | err = r.SetNextDue(q.Host, q.Due) |
| 282 | case "ClearNextDueIf": |
| 283 | err = r.ClearNextDueIf(q.Host, q.Due) |
| 284 | case "AlwaysOnWorkers": |
| 285 | out.Routes, err = r.AlwaysOnWorkers() |
| 286 | case "SetSeed": |
| 287 | err = r.SetSeed(q.Host, q.Seed) |
| 288 | case "SetArgs": |
| 289 | err = r.SetArgs(q.Host, q.Args) |
| 290 | case "SetWorkerLimits": |
| 291 | err = r.SetWorkerLimits(q.Host, q.Idle, q.MaxRun) |
| 292 | case "SetProvisioned": |
| 293 | err = r.SetProvisioned(q.Host, q.On) |
| 294 | case "SetStatusNamed": |
| 295 | err = r.SetStatusNamed(q.Host, q.On) |
| 296 | case "DueInstances": |
| 297 | out.Routes, err = r.DueInstances(q.Now) |
| 298 | case "ListAliases": |
| 299 | out.Aliases, err = r.ListAliases() |
| 300 | case "UpsertAlias": |
| 301 | err = r.UpsertAlias(q.A) |
| 302 | case "DeleteAlias": |
| 303 | err = r.DeleteAlias(q.Alias) |
| 304 | case "SetAliasDNSStatus": |
| 305 | err = r.SetAliasDNSStatus(q.Alias, q.Status, q.At) |
| 306 | case "SetAliasCertExpiresAt": |
| 307 | err = r.SetAliasCertExpiresAt(q.Alias, q.At) |
| 308 | case "ListWildcardDomains": |
| 309 | out.Wildcards, err = r.ListWildcardDomains() |
| 310 | case "UpsertWildcardDomain": |
| 311 | err = r.UpsertWildcardDomain(q.W) |
| 312 | case "DeleteWildcardDomain": |
| 313 | err = r.DeleteWildcardDomain(q.Host) |
| 314 | case "ListPaths": |
| 315 | out.Paths, err = r.ListPaths() |
| 316 | case "UpsertPath": |
| 317 | err = r.UpsertPath(q.P) |
| 318 | case "DeletePath": |
| 319 | err = r.DeletePath(q.Host, q.Prefix) |
| 320 | case "Fingerprint": |
| 321 | out.Text, err = r.Fingerprint() |
| 322 | case "SnapshotFingerprint": |
| 323 | out.Text, err = r.SnapshotFingerprint() |
| 324 | case "SnapshotTo": |
| 325 | err = r.SnapshotTo(q.Path) |
| 326 | case "UpsertTimer": |
| 327 | err = r.UpsertTimer(q.T) |
| 328 | case "ReplaceTimers": |
| 329 | err = r.ReplaceTimers(q.Host, q.Rows) |
| 330 | case "GetTimer": |
| 331 | out.Timer, err = r.GetTimer(q.Host, q.Name) |
| 332 | case "DeleteTimer": |
| 333 | err = r.DeleteTimer(q.Host, q.Name) |
| 334 | case "DeleteTimerRegistration": |
| 335 | err = r.DeleteTimerRegistration(q.Host, q.Name, q.Registration) |
| 336 | case "TimersFor": |
| 337 | out.Timers, err = r.TimersFor(q.Host) |
| 338 | case "DueTimers": |
| 339 | out.Timers, err = r.DueTimers(q.Now, q.Limit, q.ExcludeHosts) |
| 340 | case "DueUnheldTimers": |
| 341 | out.Timers, err = r.DueUnheldTimers(q.Now, q.Limit, q.ExcludeHosts) |
| 342 | case "FireTimerNow": |
| 343 | err = r.FireTimerNow(q.Host, q.Name, q.Now) |
| 344 | case "MarkTimerFired": |
| 345 | out.Changed, err = r.MarkTimerFired(q.Host, q.Name, q.Registration, q.At, q.Status, q.Ms, q.Attempts, q.NextAt, q.Due) |
| 346 | case "SetTimerStatus": |
| 347 | err = r.SetTimerStatus(q.Host, q.Name, q.Status) |
| 348 | case "CountTimers": |
| 349 | out.Number, err = r.CountTimers(q.Host, q.Kind) |
| 350 | case "PruneTimers": |
| 351 | out.Number, err = r.PruneTimers(q.Alive, q.DoneBefore) |
| 352 | case "DeleteTimersExcept": |
| 353 | out.Number, err = r.DeleteTimersExcept(q.Host, q.Kind, q.Keep) |
| 354 | case "EarliestTimers": |
| 355 | out.Times, err = r.EarliestTimers() |
| 356 | default: |
| 357 | err = errRemoteMethod |
| 358 | } |
| 359 | return |
| 360 | } |
| 361 | |