glclient.scheduler_pb2_grpc
Client and server classes corresponding to protobuf-defined services.
1# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! 2"""Client and server classes corresponding to protobuf-defined services.""" 3import grpc 4import warnings 5 6from glclient import greenlight_pb2 as glclient_dot_greenlight__pb2 7from glclient import scheduler_pb2 as glclient_dot_scheduler__pb2 8 9GRPC_GENERATED_VERSION = '1.64.1' 10GRPC_VERSION = grpc.__version__ 11EXPECTED_ERROR_RELEASE = '1.65.0' 12SCHEDULED_RELEASE_DATE = 'June 25, 2024' 13_version_not_supported = False 14 15try: 16 from grpc._utilities import first_version_is_lower 17 _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) 18except ImportError: 19 _version_not_supported = True 20 21if _version_not_supported: 22 warnings.warn( 23 f'The grpc package installed is at version {GRPC_VERSION},' 24 + f' but the generated code in glclient/scheduler_pb2_grpc.py depends on' 25 + f' grpcio>={GRPC_GENERATED_VERSION}.' 26 + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' 27 + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' 28 + f' This warning will become an error in {EXPECTED_ERROR_RELEASE},' 29 + f' scheduled for release on {SCHEDULED_RELEASE_DATE}.', 30 RuntimeWarning 31 ) 32 33 34class SchedulerStub(object): 35 """The scheduler service is the endpoint which allows users to 36 register a new node with greenlight, recover access to an existing 37 node if the owner lost its credentials, schedule the node to be run 38 on greenlight's infrastructure, and retrieve metadata about the 39 node. 40 41 Node 42 ==== 43 44 A node is the basic object representing an account on 45 greenlight. Each node corresponds to a c-lightning instance bound 46 to a specific network that can be scheduled on greenlight, and must 47 have a unique `node_id`. 48 49 Nodes are scheduled on-demand onto the infrastructure, but the time 50 to schedule a node is almost instantaneous. 51 52 Authentication 53 ============== 54 55 Users are authenticated using mTLS authentication. Applications are 56 provisioned with an anonymous keypair that is not bound to a node, 57 allowing access only to the unauthenticated endpoints 58 `Scheduler.GetChallenge`, `Scheduler.Register` and 59 `Scheduler.Recover`. This allows them to register or recover a 60 node, but doesn't give access to the node itself. Upon registering 61 or recovering an account the user receives a keypair that is bound 62 to the specific node. Once the user receives their personal mTLS 63 keypair they may use it to connect to greenlight, and thus get 64 access to the node-specific functionality. Please refer to the 65 documentation of your grpc library to learn how to configure grpc 66 to use the node-specific mTLS keypair. 67 68 """ 69 70 def __init__(self, channel): 71 """Constructor. 72 73 Args: 74 channel: A grpc.Channel. 75 """ 76 self.Register = channel.unary_unary( 77 '/scheduler.Scheduler/Register', 78 request_serializer=glclient_dot_scheduler__pb2.RegistrationRequest.SerializeToString, 79 response_deserializer=glclient_dot_scheduler__pb2.RegistrationResponse.FromString, 80 _registered_method=True) 81 self.Recover = channel.unary_unary( 82 '/scheduler.Scheduler/Recover', 83 request_serializer=glclient_dot_scheduler__pb2.RecoveryRequest.SerializeToString, 84 response_deserializer=glclient_dot_scheduler__pb2.RecoveryResponse.FromString, 85 _registered_method=True) 86 self.GetChallenge = channel.unary_unary( 87 '/scheduler.Scheduler/GetChallenge', 88 request_serializer=glclient_dot_scheduler__pb2.ChallengeRequest.SerializeToString, 89 response_deserializer=glclient_dot_scheduler__pb2.ChallengeResponse.FromString, 90 _registered_method=True) 91 self.Schedule = channel.unary_unary( 92 '/scheduler.Scheduler/Schedule', 93 request_serializer=glclient_dot_scheduler__pb2.ScheduleRequest.SerializeToString, 94 response_deserializer=glclient_dot_scheduler__pb2.NodeInfoResponse.FromString, 95 _registered_method=True) 96 self.GetNodeInfo = channel.unary_unary( 97 '/scheduler.Scheduler/GetNodeInfo', 98 request_serializer=glclient_dot_scheduler__pb2.NodeInfoRequest.SerializeToString, 99 response_deserializer=glclient_dot_scheduler__pb2.NodeInfoResponse.FromString, 100 _registered_method=True) 101 self.MaybeUpgrade = channel.unary_unary( 102 '/scheduler.Scheduler/MaybeUpgrade', 103 request_serializer=glclient_dot_scheduler__pb2.UpgradeRequest.SerializeToString, 104 response_deserializer=glclient_dot_scheduler__pb2.UpgradeResponse.FromString, 105 _registered_method=True) 106 self.ListInviteCodes = channel.unary_unary( 107 '/scheduler.Scheduler/ListInviteCodes', 108 request_serializer=glclient_dot_scheduler__pb2.ListInviteCodesRequest.SerializeToString, 109 response_deserializer=glclient_dot_scheduler__pb2.ListInviteCodesResponse.FromString, 110 _registered_method=True) 111 self.ExportNode = channel.unary_unary( 112 '/scheduler.Scheduler/ExportNode', 113 request_serializer=glclient_dot_scheduler__pb2.ExportNodeRequest.SerializeToString, 114 response_deserializer=glclient_dot_scheduler__pb2.ExportNodeResponse.FromString, 115 _registered_method=True) 116 self.AddOutgoingWebhook = channel.unary_unary( 117 '/scheduler.Scheduler/AddOutgoingWebhook', 118 request_serializer=glclient_dot_scheduler__pb2.AddOutgoingWebhookRequest.SerializeToString, 119 response_deserializer=glclient_dot_scheduler__pb2.AddOutgoingWebhookResponse.FromString, 120 _registered_method=True) 121 self.ListOutgoingWebhooks = channel.unary_unary( 122 '/scheduler.Scheduler/ListOutgoingWebhooks', 123 request_serializer=glclient_dot_scheduler__pb2.ListOutgoingWebhooksRequest.SerializeToString, 124 response_deserializer=glclient_dot_scheduler__pb2.ListOutgoingWebhooksResponse.FromString, 125 _registered_method=True) 126 self.DeleteWebhooks = channel.unary_unary( 127 '/scheduler.Scheduler/DeleteWebhooks', 128 request_serializer=glclient_dot_scheduler__pb2.DeleteOutgoingWebhooksRequest.SerializeToString, 129 response_deserializer=glclient_dot_greenlight__pb2.Empty.FromString, 130 _registered_method=True) 131 self.RotateOutgoingWebhookSecret = channel.unary_unary( 132 '/scheduler.Scheduler/RotateOutgoingWebhookSecret', 133 request_serializer=glclient_dot_scheduler__pb2.RotateOutgoingWebhookSecretRequest.SerializeToString, 134 response_deserializer=glclient_dot_scheduler__pb2.WebhookSecretResponse.FromString, 135 _registered_method=True) 136 self.SignerRequestsStream = channel.stream_stream( 137 '/scheduler.Scheduler/SignerRequestsStream', 138 request_serializer=glclient_dot_scheduler__pb2.SignerResponse.SerializeToString, 139 response_deserializer=glclient_dot_scheduler__pb2.SignerRequest.FromString, 140 _registered_method=True) 141 142 143class SchedulerServicer(object): 144 """The scheduler service is the endpoint which allows users to 145 register a new node with greenlight, recover access to an existing 146 node if the owner lost its credentials, schedule the node to be run 147 on greenlight's infrastructure, and retrieve metadata about the 148 node. 149 150 Node 151 ==== 152 153 A node is the basic object representing an account on 154 greenlight. Each node corresponds to a c-lightning instance bound 155 to a specific network that can be scheduled on greenlight, and must 156 have a unique `node_id`. 157 158 Nodes are scheduled on-demand onto the infrastructure, but the time 159 to schedule a node is almost instantaneous. 160 161 Authentication 162 ============== 163 164 Users are authenticated using mTLS authentication. Applications are 165 provisioned with an anonymous keypair that is not bound to a node, 166 allowing access only to the unauthenticated endpoints 167 `Scheduler.GetChallenge`, `Scheduler.Register` and 168 `Scheduler.Recover`. This allows them to register or recover a 169 node, but doesn't give access to the node itself. Upon registering 170 or recovering an account the user receives a keypair that is bound 171 to the specific node. Once the user receives their personal mTLS 172 keypair they may use it to connect to greenlight, and thus get 173 access to the node-specific functionality. Please refer to the 174 documentation of your grpc library to learn how to configure grpc 175 to use the node-specific mTLS keypair. 176 177 """ 178 179 def Register(self, request, context): 180 """A user may register a new node with greenlight by providing 181 some basic metadata and proving that they have access to 182 the corresponding private key (see challenge-response 183 mechanism below). This means that in order to register a 184 new node the user must have access to the corresponding 185 private keys to prove ownership, and prevent users from 186 just registering arbitrary node_ids without actually 187 knowing the corresponding secrets. 188 189 Upon successful registration an mTLS certificate and 190 private key are returned. These can be used to authenticate 191 future connections to the scheduler or the node. 192 193 Each node may be registered once, any later attempt will 194 result in an error being returned. If the user lost its 195 credentials it can make use of the Recover RPC method to 196 recover the credentials. Notice that this also means that 197 the same node_id cannot be reused for different networks. 198 """ 199 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 200 context.set_details('Method not implemented!') 201 raise NotImplementedError('Method not implemented!') 202 203 def Recover(self, request, context): 204 """Should a user have lost its credentials (mTLS keypair) for 205 any reason, they may regain access to their node using the 206 Recover RPC method. Similar to the initial registration the 207 caller needs to authenticate the call by proving access to 208 the node's secret. This also uses the challenge-response 209 mechanism. 210 211 Upon success a newly generated mTLS certificate and private 212 key are returned, allowing the user to authenticate going 213 forward. Existing keypairs are not revoked, in order to 214 avoid locking out other authenticated applications. 215 """ 216 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 217 context.set_details('Method not implemented!') 218 raise NotImplementedError('Method not implemented!') 219 220 def GetChallenge(self, request, context): 221 """Challenges are one-time values issued by the server, used 222 to authenticate a user/device against the server. A user or 223 device can authenticate to the server by signing the 224 challenge and returning the signed message as part of the 225 request that is to be authenticated. 226 227 Challenges may not be reused, and are bound to the scope 228 they have been issued for. Attempting to reuse a challenge 229 or use a challenge with a different scope will result in an 230 error being returned. 231 """ 232 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 233 context.set_details('Method not implemented!') 234 raise NotImplementedError('Method not implemented!') 235 236 def Schedule(self, request, context): 237 """Scheduling takes a previously registered node, locates a 238 free slot in greenlight's infrastructure and allocates it 239 to run the node. The node then goes through the startup 240 sequence, synchronizing with the blockchain, and finally 241 binding its grpc interface (see Node service below) to a 242 public IP address and port. Access is authenticated via the 243 mTLS keypair the user received from registering or 244 recovering the node. 245 246 Upon success a NodeInfoResponse containing the grpc 247 connection details and some metadata is returned. The 248 application must use the grpc details and its node-specific 249 mTLS keypair to interact with the node directly. 250 """ 251 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 252 context.set_details('Method not implemented!') 253 raise NotImplementedError('Method not implemented!') 254 255 def GetNodeInfo(self, request, context): 256 """Much like `Schedule` this call is used to retrieve the 257 metadata and grpc details of a node. Unlike the other call 258 however it is passive, and will not result in the node 259 being scheduled if it isn't already running. This can be 260 used to check if a node is already scheduled, or to wait 261 for it to be scheduled (e.g., if the caller is an `hsmd` 262 that signs off on changes, but doesn't want to keep the 263 node itself scheduled). 264 """ 265 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 266 context.set_details('Method not implemented!') 267 raise NotImplementedError('Method not implemented!') 268 269 def MaybeUpgrade(self, request, context): 270 """The signer may want to trigger an upgrade of the node 271 before waiting for the node to be scheduled. This ensures 272 that the signer version is in sync with the node 273 version. The scheduler may decide to defer upgrading if the 274 protocols are compatible. Please do not use this directly, 275 rather use the Signer in the client library to trigger this 276 automatically when required. Posting an incomplete or 277 non-functional UpgradeRequest may result in unschedulable 278 nodes. 279 """ 280 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 281 context.set_details('Method not implemented!') 282 raise NotImplementedError('Method not implemented!') 283 284 def ListInviteCodes(self, request, context): 285 """This call is used to fetch a list of invite codes associated 286 with the node id of the client. These invite codes can be used 287 for further registration of new nodes. 288 """ 289 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 290 context.set_details('Method not implemented!') 291 raise NotImplementedError('Method not implemented!') 292 293 def ExportNode(self, request, context): 294 """Exporting a node allows users to take control of their node 295 296 This method initiates the node export on Greenlight, 297 allowing users to offboard from GL into their own 298 infrastructure. After calling this method the node will no 299 longer be schedulable on Greenlight, since it is never safe 300 to assume there haven't been changes in the node's state 301 (see CLN Backups documentation for details). `ExportNode` 302 marks the node as `Exporting`, then generates an encryption 303 secret which is then used to encrypt a database 304 backup. This encrypted database backup is then made 305 accessible through an HTTP server, and a link to it is 306 returned as a response to `ExportNode`. After the export 307 completes the node is marked as `Exported`. The encryption 308 key can then be derived using the signer, using ECDH, 309 allowing only users with the node secret to decrypt it. 310 311 `ExportNode` is idempotent and may be called multiple 312 times, without causing the node to be re-exported multiple 313 times, should the call or the download be interrupted. DO 314 NOT import the backup multiple times into your 315 infrastructure, as that can lead to dataloss (old state 316 being replayed) and loss of funds (see CLN Backups 317 documentation for more information) 318 """ 319 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 320 context.set_details('Method not implemented!') 321 raise NotImplementedError('Method not implemented!') 322 323 def AddOutgoingWebhook(self, request, context): 324 """Missing associated documentation comment in .proto file.""" 325 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 326 context.set_details('Method not implemented!') 327 raise NotImplementedError('Method not implemented!') 328 329 def ListOutgoingWebhooks(self, request, context): 330 """Missing associated documentation comment in .proto file.""" 331 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 332 context.set_details('Method not implemented!') 333 raise NotImplementedError('Method not implemented!') 334 335 def DeleteWebhooks(self, request, context): 336 """Missing associated documentation comment in .proto file.""" 337 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 338 context.set_details('Method not implemented!') 339 raise NotImplementedError('Method not implemented!') 340 341 def RotateOutgoingWebhookSecret(self, request, context): 342 """Missing associated documentation comment in .proto file.""" 343 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 344 context.set_details('Method not implemented!') 345 raise NotImplementedError('Method not implemented!') 346 347 def SignerRequestsStream(self, request_iterator, context): 348 """Attaches a Signer via a bidirectional stream to the scheduler. 349 This is a communication channel between greenlight and the signing 350 device that is used for requests that are not part of the node api. 351 352 The stream is used to hand out the ApprovePairingRequests that 353 the signer answers with a ApprovePairingResponse. 354 """ 355 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 356 context.set_details('Method not implemented!') 357 raise NotImplementedError('Method not implemented!') 358 359 360def add_SchedulerServicer_to_server(servicer, server): 361 rpc_method_handlers = { 362 'Register': grpc.unary_unary_rpc_method_handler( 363 servicer.Register, 364 request_deserializer=glclient_dot_scheduler__pb2.RegistrationRequest.FromString, 365 response_serializer=glclient_dot_scheduler__pb2.RegistrationResponse.SerializeToString, 366 ), 367 'Recover': grpc.unary_unary_rpc_method_handler( 368 servicer.Recover, 369 request_deserializer=glclient_dot_scheduler__pb2.RecoveryRequest.FromString, 370 response_serializer=glclient_dot_scheduler__pb2.RecoveryResponse.SerializeToString, 371 ), 372 'GetChallenge': grpc.unary_unary_rpc_method_handler( 373 servicer.GetChallenge, 374 request_deserializer=glclient_dot_scheduler__pb2.ChallengeRequest.FromString, 375 response_serializer=glclient_dot_scheduler__pb2.ChallengeResponse.SerializeToString, 376 ), 377 'Schedule': grpc.unary_unary_rpc_method_handler( 378 servicer.Schedule, 379 request_deserializer=glclient_dot_scheduler__pb2.ScheduleRequest.FromString, 380 response_serializer=glclient_dot_scheduler__pb2.NodeInfoResponse.SerializeToString, 381 ), 382 'GetNodeInfo': grpc.unary_unary_rpc_method_handler( 383 servicer.GetNodeInfo, 384 request_deserializer=glclient_dot_scheduler__pb2.NodeInfoRequest.FromString, 385 response_serializer=glclient_dot_scheduler__pb2.NodeInfoResponse.SerializeToString, 386 ), 387 'MaybeUpgrade': grpc.unary_unary_rpc_method_handler( 388 servicer.MaybeUpgrade, 389 request_deserializer=glclient_dot_scheduler__pb2.UpgradeRequest.FromString, 390 response_serializer=glclient_dot_scheduler__pb2.UpgradeResponse.SerializeToString, 391 ), 392 'ListInviteCodes': grpc.unary_unary_rpc_method_handler( 393 servicer.ListInviteCodes, 394 request_deserializer=glclient_dot_scheduler__pb2.ListInviteCodesRequest.FromString, 395 response_serializer=glclient_dot_scheduler__pb2.ListInviteCodesResponse.SerializeToString, 396 ), 397 'ExportNode': grpc.unary_unary_rpc_method_handler( 398 servicer.ExportNode, 399 request_deserializer=glclient_dot_scheduler__pb2.ExportNodeRequest.FromString, 400 response_serializer=glclient_dot_scheduler__pb2.ExportNodeResponse.SerializeToString, 401 ), 402 'AddOutgoingWebhook': grpc.unary_unary_rpc_method_handler( 403 servicer.AddOutgoingWebhook, 404 request_deserializer=glclient_dot_scheduler__pb2.AddOutgoingWebhookRequest.FromString, 405 response_serializer=glclient_dot_scheduler__pb2.AddOutgoingWebhookResponse.SerializeToString, 406 ), 407 'ListOutgoingWebhooks': grpc.unary_unary_rpc_method_handler( 408 servicer.ListOutgoingWebhooks, 409 request_deserializer=glclient_dot_scheduler__pb2.ListOutgoingWebhooksRequest.FromString, 410 response_serializer=glclient_dot_scheduler__pb2.ListOutgoingWebhooksResponse.SerializeToString, 411 ), 412 'DeleteWebhooks': grpc.unary_unary_rpc_method_handler( 413 servicer.DeleteWebhooks, 414 request_deserializer=glclient_dot_scheduler__pb2.DeleteOutgoingWebhooksRequest.FromString, 415 response_serializer=glclient_dot_greenlight__pb2.Empty.SerializeToString, 416 ), 417 'RotateOutgoingWebhookSecret': grpc.unary_unary_rpc_method_handler( 418 servicer.RotateOutgoingWebhookSecret, 419 request_deserializer=glclient_dot_scheduler__pb2.RotateOutgoingWebhookSecretRequest.FromString, 420 response_serializer=glclient_dot_scheduler__pb2.WebhookSecretResponse.SerializeToString, 421 ), 422 'SignerRequestsStream': grpc.stream_stream_rpc_method_handler( 423 servicer.SignerRequestsStream, 424 request_deserializer=glclient_dot_scheduler__pb2.SignerResponse.FromString, 425 response_serializer=glclient_dot_scheduler__pb2.SignerRequest.SerializeToString, 426 ), 427 } 428 generic_handler = grpc.method_handlers_generic_handler( 429 'scheduler.Scheduler', rpc_method_handlers) 430 server.add_generic_rpc_handlers((generic_handler,)) 431 server.add_registered_method_handlers('scheduler.Scheduler', rpc_method_handlers) 432 433 434 # This class is part of an EXPERIMENTAL API. 435class Scheduler(object): 436 """The scheduler service is the endpoint which allows users to 437 register a new node with greenlight, recover access to an existing 438 node if the owner lost its credentials, schedule the node to be run 439 on greenlight's infrastructure, and retrieve metadata about the 440 node. 441 442 Node 443 ==== 444 445 A node is the basic object representing an account on 446 greenlight. Each node corresponds to a c-lightning instance bound 447 to a specific network that can be scheduled on greenlight, and must 448 have a unique `node_id`. 449 450 Nodes are scheduled on-demand onto the infrastructure, but the time 451 to schedule a node is almost instantaneous. 452 453 Authentication 454 ============== 455 456 Users are authenticated using mTLS authentication. Applications are 457 provisioned with an anonymous keypair that is not bound to a node, 458 allowing access only to the unauthenticated endpoints 459 `Scheduler.GetChallenge`, `Scheduler.Register` and 460 `Scheduler.Recover`. This allows them to register or recover a 461 node, but doesn't give access to the node itself. Upon registering 462 or recovering an account the user receives a keypair that is bound 463 to the specific node. Once the user receives their personal mTLS 464 keypair they may use it to connect to greenlight, and thus get 465 access to the node-specific functionality. Please refer to the 466 documentation of your grpc library to learn how to configure grpc 467 to use the node-specific mTLS keypair. 468 469 """ 470 471 @staticmethod 472 def Register(request, 473 target, 474 options=(), 475 channel_credentials=None, 476 call_credentials=None, 477 insecure=False, 478 compression=None, 479 wait_for_ready=None, 480 timeout=None, 481 metadata=None): 482 return grpc.experimental.unary_unary( 483 request, 484 target, 485 '/scheduler.Scheduler/Register', 486 glclient_dot_scheduler__pb2.RegistrationRequest.SerializeToString, 487 glclient_dot_scheduler__pb2.RegistrationResponse.FromString, 488 options, 489 channel_credentials, 490 insecure, 491 call_credentials, 492 compression, 493 wait_for_ready, 494 timeout, 495 metadata, 496 _registered_method=True) 497 498 @staticmethod 499 def Recover(request, 500 target, 501 options=(), 502 channel_credentials=None, 503 call_credentials=None, 504 insecure=False, 505 compression=None, 506 wait_for_ready=None, 507 timeout=None, 508 metadata=None): 509 return grpc.experimental.unary_unary( 510 request, 511 target, 512 '/scheduler.Scheduler/Recover', 513 glclient_dot_scheduler__pb2.RecoveryRequest.SerializeToString, 514 glclient_dot_scheduler__pb2.RecoveryResponse.FromString, 515 options, 516 channel_credentials, 517 insecure, 518 call_credentials, 519 compression, 520 wait_for_ready, 521 timeout, 522 metadata, 523 _registered_method=True) 524 525 @staticmethod 526 def GetChallenge(request, 527 target, 528 options=(), 529 channel_credentials=None, 530 call_credentials=None, 531 insecure=False, 532 compression=None, 533 wait_for_ready=None, 534 timeout=None, 535 metadata=None): 536 return grpc.experimental.unary_unary( 537 request, 538 target, 539 '/scheduler.Scheduler/GetChallenge', 540 glclient_dot_scheduler__pb2.ChallengeRequest.SerializeToString, 541 glclient_dot_scheduler__pb2.ChallengeResponse.FromString, 542 options, 543 channel_credentials, 544 insecure, 545 call_credentials, 546 compression, 547 wait_for_ready, 548 timeout, 549 metadata, 550 _registered_method=True) 551 552 @staticmethod 553 def Schedule(request, 554 target, 555 options=(), 556 channel_credentials=None, 557 call_credentials=None, 558 insecure=False, 559 compression=None, 560 wait_for_ready=None, 561 timeout=None, 562 metadata=None): 563 return grpc.experimental.unary_unary( 564 request, 565 target, 566 '/scheduler.Scheduler/Schedule', 567 glclient_dot_scheduler__pb2.ScheduleRequest.SerializeToString, 568 glclient_dot_scheduler__pb2.NodeInfoResponse.FromString, 569 options, 570 channel_credentials, 571 insecure, 572 call_credentials, 573 compression, 574 wait_for_ready, 575 timeout, 576 metadata, 577 _registered_method=True) 578 579 @staticmethod 580 def GetNodeInfo(request, 581 target, 582 options=(), 583 channel_credentials=None, 584 call_credentials=None, 585 insecure=False, 586 compression=None, 587 wait_for_ready=None, 588 timeout=None, 589 metadata=None): 590 return grpc.experimental.unary_unary( 591 request, 592 target, 593 '/scheduler.Scheduler/GetNodeInfo', 594 glclient_dot_scheduler__pb2.NodeInfoRequest.SerializeToString, 595 glclient_dot_scheduler__pb2.NodeInfoResponse.FromString, 596 options, 597 channel_credentials, 598 insecure, 599 call_credentials, 600 compression, 601 wait_for_ready, 602 timeout, 603 metadata, 604 _registered_method=True) 605 606 @staticmethod 607 def MaybeUpgrade(request, 608 target, 609 options=(), 610 channel_credentials=None, 611 call_credentials=None, 612 insecure=False, 613 compression=None, 614 wait_for_ready=None, 615 timeout=None, 616 metadata=None): 617 return grpc.experimental.unary_unary( 618 request, 619 target, 620 '/scheduler.Scheduler/MaybeUpgrade', 621 glclient_dot_scheduler__pb2.UpgradeRequest.SerializeToString, 622 glclient_dot_scheduler__pb2.UpgradeResponse.FromString, 623 options, 624 channel_credentials, 625 insecure, 626 call_credentials, 627 compression, 628 wait_for_ready, 629 timeout, 630 metadata, 631 _registered_method=True) 632 633 @staticmethod 634 def ListInviteCodes(request, 635 target, 636 options=(), 637 channel_credentials=None, 638 call_credentials=None, 639 insecure=False, 640 compression=None, 641 wait_for_ready=None, 642 timeout=None, 643 metadata=None): 644 return grpc.experimental.unary_unary( 645 request, 646 target, 647 '/scheduler.Scheduler/ListInviteCodes', 648 glclient_dot_scheduler__pb2.ListInviteCodesRequest.SerializeToString, 649 glclient_dot_scheduler__pb2.ListInviteCodesResponse.FromString, 650 options, 651 channel_credentials, 652 insecure, 653 call_credentials, 654 compression, 655 wait_for_ready, 656 timeout, 657 metadata, 658 _registered_method=True) 659 660 @staticmethod 661 def ExportNode(request, 662 target, 663 options=(), 664 channel_credentials=None, 665 call_credentials=None, 666 insecure=False, 667 compression=None, 668 wait_for_ready=None, 669 timeout=None, 670 metadata=None): 671 return grpc.experimental.unary_unary( 672 request, 673 target, 674 '/scheduler.Scheduler/ExportNode', 675 glclient_dot_scheduler__pb2.ExportNodeRequest.SerializeToString, 676 glclient_dot_scheduler__pb2.ExportNodeResponse.FromString, 677 options, 678 channel_credentials, 679 insecure, 680 call_credentials, 681 compression, 682 wait_for_ready, 683 timeout, 684 metadata, 685 _registered_method=True) 686 687 @staticmethod 688 def AddOutgoingWebhook(request, 689 target, 690 options=(), 691 channel_credentials=None, 692 call_credentials=None, 693 insecure=False, 694 compression=None, 695 wait_for_ready=None, 696 timeout=None, 697 metadata=None): 698 return grpc.experimental.unary_unary( 699 request, 700 target, 701 '/scheduler.Scheduler/AddOutgoingWebhook', 702 glclient_dot_scheduler__pb2.AddOutgoingWebhookRequest.SerializeToString, 703 glclient_dot_scheduler__pb2.AddOutgoingWebhookResponse.FromString, 704 options, 705 channel_credentials, 706 insecure, 707 call_credentials, 708 compression, 709 wait_for_ready, 710 timeout, 711 metadata, 712 _registered_method=True) 713 714 @staticmethod 715 def ListOutgoingWebhooks(request, 716 target, 717 options=(), 718 channel_credentials=None, 719 call_credentials=None, 720 insecure=False, 721 compression=None, 722 wait_for_ready=None, 723 timeout=None, 724 metadata=None): 725 return grpc.experimental.unary_unary( 726 request, 727 target, 728 '/scheduler.Scheduler/ListOutgoingWebhooks', 729 glclient_dot_scheduler__pb2.ListOutgoingWebhooksRequest.SerializeToString, 730 glclient_dot_scheduler__pb2.ListOutgoingWebhooksResponse.FromString, 731 options, 732 channel_credentials, 733 insecure, 734 call_credentials, 735 compression, 736 wait_for_ready, 737 timeout, 738 metadata, 739 _registered_method=True) 740 741 @staticmethod 742 def DeleteWebhooks(request, 743 target, 744 options=(), 745 channel_credentials=None, 746 call_credentials=None, 747 insecure=False, 748 compression=None, 749 wait_for_ready=None, 750 timeout=None, 751 metadata=None): 752 return grpc.experimental.unary_unary( 753 request, 754 target, 755 '/scheduler.Scheduler/DeleteWebhooks', 756 glclient_dot_scheduler__pb2.DeleteOutgoingWebhooksRequest.SerializeToString, 757 glclient_dot_greenlight__pb2.Empty.FromString, 758 options, 759 channel_credentials, 760 insecure, 761 call_credentials, 762 compression, 763 wait_for_ready, 764 timeout, 765 metadata, 766 _registered_method=True) 767 768 @staticmethod 769 def RotateOutgoingWebhookSecret(request, 770 target, 771 options=(), 772 channel_credentials=None, 773 call_credentials=None, 774 insecure=False, 775 compression=None, 776 wait_for_ready=None, 777 timeout=None, 778 metadata=None): 779 return grpc.experimental.unary_unary( 780 request, 781 target, 782 '/scheduler.Scheduler/RotateOutgoingWebhookSecret', 783 glclient_dot_scheduler__pb2.RotateOutgoingWebhookSecretRequest.SerializeToString, 784 glclient_dot_scheduler__pb2.WebhookSecretResponse.FromString, 785 options, 786 channel_credentials, 787 insecure, 788 call_credentials, 789 compression, 790 wait_for_ready, 791 timeout, 792 metadata, 793 _registered_method=True) 794 795 @staticmethod 796 def SignerRequestsStream(request_iterator, 797 target, 798 options=(), 799 channel_credentials=None, 800 call_credentials=None, 801 insecure=False, 802 compression=None, 803 wait_for_ready=None, 804 timeout=None, 805 metadata=None): 806 return grpc.experimental.stream_stream( 807 request_iterator, 808 target, 809 '/scheduler.Scheduler/SignerRequestsStream', 810 glclient_dot_scheduler__pb2.SignerResponse.SerializeToString, 811 glclient_dot_scheduler__pb2.SignerRequest.FromString, 812 options, 813 channel_credentials, 814 insecure, 815 call_credentials, 816 compression, 817 wait_for_ready, 818 timeout, 819 metadata, 820 _registered_method=True) 821 822 823class DebugStub(object): 824 """A service to collect debugging information from clients. 825 """ 826 827 def __init__(self, channel): 828 """Constructor. 829 830 Args: 831 channel: A grpc.Channel. 832 """ 833 self.ReportSignerRejection = channel.unary_unary( 834 '/scheduler.Debug/ReportSignerRejection', 835 request_serializer=glclient_dot_scheduler__pb2.SignerRejection.SerializeToString, 836 response_deserializer=glclient_dot_greenlight__pb2.Empty.FromString, 837 _registered_method=True) 838 839 840class DebugServicer(object): 841 """A service to collect debugging information from clients. 842 """ 843 844 def ReportSignerRejection(self, request, context): 845 """The signer is designed to fail closed, i.e., we reject requests 846 that do not resolve or that go against one of its policies. This 847 comes with some issues, such as false negatives, where we reject 848 despite the request being valid. As more apps use the API we need 849 to debug these false negatives, hence why we report rejections, 850 so we can investigate the validity of the rejection, and to 851 fine-tine the signer's ruleset. 852 """ 853 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 854 context.set_details('Method not implemented!') 855 raise NotImplementedError('Method not implemented!') 856 857 858def add_DebugServicer_to_server(servicer, server): 859 rpc_method_handlers = { 860 'ReportSignerRejection': grpc.unary_unary_rpc_method_handler( 861 servicer.ReportSignerRejection, 862 request_deserializer=glclient_dot_scheduler__pb2.SignerRejection.FromString, 863 response_serializer=glclient_dot_greenlight__pb2.Empty.SerializeToString, 864 ), 865 } 866 generic_handler = grpc.method_handlers_generic_handler( 867 'scheduler.Debug', rpc_method_handlers) 868 server.add_generic_rpc_handlers((generic_handler,)) 869 server.add_registered_method_handlers('scheduler.Debug', rpc_method_handlers) 870 871 872 # This class is part of an EXPERIMENTAL API. 873class Debug(object): 874 """A service to collect debugging information from clients. 875 """ 876 877 @staticmethod 878 def ReportSignerRejection(request, 879 target, 880 options=(), 881 channel_credentials=None, 882 call_credentials=None, 883 insecure=False, 884 compression=None, 885 wait_for_ready=None, 886 timeout=None, 887 metadata=None): 888 return grpc.experimental.unary_unary( 889 request, 890 target, 891 '/scheduler.Debug/ReportSignerRejection', 892 glclient_dot_scheduler__pb2.SignerRejection.SerializeToString, 893 glclient_dot_greenlight__pb2.Empty.FromString, 894 options, 895 channel_credentials, 896 insecure, 897 call_credentials, 898 compression, 899 wait_for_ready, 900 timeout, 901 metadata, 902 _registered_method=True) 903 904 905class PairingStub(object): 906 """A service to pair signer-less clients with an existing signer. 907 """ 908 909 def __init__(self, channel): 910 """Constructor. 911 912 Args: 913 channel: A grpc.Channel. 914 """ 915 self.PairDevice = channel.unary_unary( 916 '/scheduler.Pairing/PairDevice', 917 request_serializer=glclient_dot_scheduler__pb2.PairDeviceRequest.SerializeToString, 918 response_deserializer=glclient_dot_scheduler__pb2.PairDeviceResponse.FromString, 919 _registered_method=True) 920 self.GetPairingData = channel.unary_unary( 921 '/scheduler.Pairing/GetPairingData', 922 request_serializer=glclient_dot_scheduler__pb2.GetPairingDataRequest.SerializeToString, 923 response_deserializer=glclient_dot_scheduler__pb2.GetPairingDataResponse.FromString, 924 _registered_method=True) 925 self.ApprovePairing = channel.unary_unary( 926 '/scheduler.Pairing/ApprovePairing', 927 request_serializer=glclient_dot_scheduler__pb2.ApprovePairingRequest.SerializeToString, 928 response_deserializer=glclient_dot_greenlight__pb2.Empty.FromString, 929 _registered_method=True) 930 931 932class PairingServicer(object): 933 """A service to pair signer-less clients with an existing signer. 934 """ 935 936 def PairDevice(self, request, context): 937 """Initiates a new Pairing Sessions. This is called by the new 938 device that wants to request a pairing from an existing device. 939 The session lifetime is bound to the stream so closing the 940 stream destroys the session. 941 """ 942 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 943 context.set_details('Method not implemented!') 944 raise NotImplementedError('Method not implemented!') 945 946 def GetPairingData(self, request, context): 947 """Returns the pairing related data that belongs to a pairing 948 session. This is meant to be called from a device that can 949 approve a pairing request, we sometimes call it "old device". 950 """ 951 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 952 context.set_details('Method not implemented!') 953 raise NotImplementedError('Method not implemented!') 954 955 def ApprovePairing(self, request, context): 956 """Approves a pairing request. The ApprovePairingRequest is 957 forwarded to a signer for further processing. 958 """ 959 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 960 context.set_details('Method not implemented!') 961 raise NotImplementedError('Method not implemented!') 962 963 964def add_PairingServicer_to_server(servicer, server): 965 rpc_method_handlers = { 966 'PairDevice': grpc.unary_unary_rpc_method_handler( 967 servicer.PairDevice, 968 request_deserializer=glclient_dot_scheduler__pb2.PairDeviceRequest.FromString, 969 response_serializer=glclient_dot_scheduler__pb2.PairDeviceResponse.SerializeToString, 970 ), 971 'GetPairingData': grpc.unary_unary_rpc_method_handler( 972 servicer.GetPairingData, 973 request_deserializer=glclient_dot_scheduler__pb2.GetPairingDataRequest.FromString, 974 response_serializer=glclient_dot_scheduler__pb2.GetPairingDataResponse.SerializeToString, 975 ), 976 'ApprovePairing': grpc.unary_unary_rpc_method_handler( 977 servicer.ApprovePairing, 978 request_deserializer=glclient_dot_scheduler__pb2.ApprovePairingRequest.FromString, 979 response_serializer=glclient_dot_greenlight__pb2.Empty.SerializeToString, 980 ), 981 } 982 generic_handler = grpc.method_handlers_generic_handler( 983 'scheduler.Pairing', rpc_method_handlers) 984 server.add_generic_rpc_handlers((generic_handler,)) 985 server.add_registered_method_handlers('scheduler.Pairing', rpc_method_handlers) 986 987 988 # This class is part of an EXPERIMENTAL API. 989class Pairing(object): 990 """A service to pair signer-less clients with an existing signer. 991 """ 992 993 @staticmethod 994 def PairDevice(request, 995 target, 996 options=(), 997 channel_credentials=None, 998 call_credentials=None, 999 insecure=False, 1000 compression=None, 1001 wait_for_ready=None, 1002 timeout=None, 1003 metadata=None): 1004 return grpc.experimental.unary_unary( 1005 request, 1006 target, 1007 '/scheduler.Pairing/PairDevice', 1008 glclient_dot_scheduler__pb2.PairDeviceRequest.SerializeToString, 1009 glclient_dot_scheduler__pb2.PairDeviceResponse.FromString, 1010 options, 1011 channel_credentials, 1012 insecure, 1013 call_credentials, 1014 compression, 1015 wait_for_ready, 1016 timeout, 1017 metadata, 1018 _registered_method=True) 1019 1020 @staticmethod 1021 def GetPairingData(request, 1022 target, 1023 options=(), 1024 channel_credentials=None, 1025 call_credentials=None, 1026 insecure=False, 1027 compression=None, 1028 wait_for_ready=None, 1029 timeout=None, 1030 metadata=None): 1031 return grpc.experimental.unary_unary( 1032 request, 1033 target, 1034 '/scheduler.Pairing/GetPairingData', 1035 glclient_dot_scheduler__pb2.GetPairingDataRequest.SerializeToString, 1036 glclient_dot_scheduler__pb2.GetPairingDataResponse.FromString, 1037 options, 1038 channel_credentials, 1039 insecure, 1040 call_credentials, 1041 compression, 1042 wait_for_ready, 1043 timeout, 1044 metadata, 1045 _registered_method=True) 1046 1047 @staticmethod 1048 def ApprovePairing(request, 1049 target, 1050 options=(), 1051 channel_credentials=None, 1052 call_credentials=None, 1053 insecure=False, 1054 compression=None, 1055 wait_for_ready=None, 1056 timeout=None, 1057 metadata=None): 1058 return grpc.experimental.unary_unary( 1059 request, 1060 target, 1061 '/scheduler.Pairing/ApprovePairing', 1062 glclient_dot_scheduler__pb2.ApprovePairingRequest.SerializeToString, 1063 glclient_dot_greenlight__pb2.Empty.FromString, 1064 options, 1065 channel_credentials, 1066 insecure, 1067 call_credentials, 1068 compression, 1069 wait_for_ready, 1070 timeout, 1071 metadata, 1072 _registered_method=True)
35class SchedulerStub(object): 36 """The scheduler service is the endpoint which allows users to 37 register a new node with greenlight, recover access to an existing 38 node if the owner lost its credentials, schedule the node to be run 39 on greenlight's infrastructure, and retrieve metadata about the 40 node. 41 42 Node 43 ==== 44 45 A node is the basic object representing an account on 46 greenlight. Each node corresponds to a c-lightning instance bound 47 to a specific network that can be scheduled on greenlight, and must 48 have a unique `node_id`. 49 50 Nodes are scheduled on-demand onto the infrastructure, but the time 51 to schedule a node is almost instantaneous. 52 53 Authentication 54 ============== 55 56 Users are authenticated using mTLS authentication. Applications are 57 provisioned with an anonymous keypair that is not bound to a node, 58 allowing access only to the unauthenticated endpoints 59 `Scheduler.GetChallenge`, `Scheduler.Register` and 60 `Scheduler.Recover`. This allows them to register or recover a 61 node, but doesn't give access to the node itself. Upon registering 62 or recovering an account the user receives a keypair that is bound 63 to the specific node. Once the user receives their personal mTLS 64 keypair they may use it to connect to greenlight, and thus get 65 access to the node-specific functionality. Please refer to the 66 documentation of your grpc library to learn how to configure grpc 67 to use the node-specific mTLS keypair. 68 69 """ 70 71 def __init__(self, channel): 72 """Constructor. 73 74 Args: 75 channel: A grpc.Channel. 76 """ 77 self.Register = channel.unary_unary( 78 '/scheduler.Scheduler/Register', 79 request_serializer=glclient_dot_scheduler__pb2.RegistrationRequest.SerializeToString, 80 response_deserializer=glclient_dot_scheduler__pb2.RegistrationResponse.FromString, 81 _registered_method=True) 82 self.Recover = channel.unary_unary( 83 '/scheduler.Scheduler/Recover', 84 request_serializer=glclient_dot_scheduler__pb2.RecoveryRequest.SerializeToString, 85 response_deserializer=glclient_dot_scheduler__pb2.RecoveryResponse.FromString, 86 _registered_method=True) 87 self.GetChallenge = channel.unary_unary( 88 '/scheduler.Scheduler/GetChallenge', 89 request_serializer=glclient_dot_scheduler__pb2.ChallengeRequest.SerializeToString, 90 response_deserializer=glclient_dot_scheduler__pb2.ChallengeResponse.FromString, 91 _registered_method=True) 92 self.Schedule = channel.unary_unary( 93 '/scheduler.Scheduler/Schedule', 94 request_serializer=glclient_dot_scheduler__pb2.ScheduleRequest.SerializeToString, 95 response_deserializer=glclient_dot_scheduler__pb2.NodeInfoResponse.FromString, 96 _registered_method=True) 97 self.GetNodeInfo = channel.unary_unary( 98 '/scheduler.Scheduler/GetNodeInfo', 99 request_serializer=glclient_dot_scheduler__pb2.NodeInfoRequest.SerializeToString, 100 response_deserializer=glclient_dot_scheduler__pb2.NodeInfoResponse.FromString, 101 _registered_method=True) 102 self.MaybeUpgrade = channel.unary_unary( 103 '/scheduler.Scheduler/MaybeUpgrade', 104 request_serializer=glclient_dot_scheduler__pb2.UpgradeRequest.SerializeToString, 105 response_deserializer=glclient_dot_scheduler__pb2.UpgradeResponse.FromString, 106 _registered_method=True) 107 self.ListInviteCodes = channel.unary_unary( 108 '/scheduler.Scheduler/ListInviteCodes', 109 request_serializer=glclient_dot_scheduler__pb2.ListInviteCodesRequest.SerializeToString, 110 response_deserializer=glclient_dot_scheduler__pb2.ListInviteCodesResponse.FromString, 111 _registered_method=True) 112 self.ExportNode = channel.unary_unary( 113 '/scheduler.Scheduler/ExportNode', 114 request_serializer=glclient_dot_scheduler__pb2.ExportNodeRequest.SerializeToString, 115 response_deserializer=glclient_dot_scheduler__pb2.ExportNodeResponse.FromString, 116 _registered_method=True) 117 self.AddOutgoingWebhook = channel.unary_unary( 118 '/scheduler.Scheduler/AddOutgoingWebhook', 119 request_serializer=glclient_dot_scheduler__pb2.AddOutgoingWebhookRequest.SerializeToString, 120 response_deserializer=glclient_dot_scheduler__pb2.AddOutgoingWebhookResponse.FromString, 121 _registered_method=True) 122 self.ListOutgoingWebhooks = channel.unary_unary( 123 '/scheduler.Scheduler/ListOutgoingWebhooks', 124 request_serializer=glclient_dot_scheduler__pb2.ListOutgoingWebhooksRequest.SerializeToString, 125 response_deserializer=glclient_dot_scheduler__pb2.ListOutgoingWebhooksResponse.FromString, 126 _registered_method=True) 127 self.DeleteWebhooks = channel.unary_unary( 128 '/scheduler.Scheduler/DeleteWebhooks', 129 request_serializer=glclient_dot_scheduler__pb2.DeleteOutgoingWebhooksRequest.SerializeToString, 130 response_deserializer=glclient_dot_greenlight__pb2.Empty.FromString, 131 _registered_method=True) 132 self.RotateOutgoingWebhookSecret = channel.unary_unary( 133 '/scheduler.Scheduler/RotateOutgoingWebhookSecret', 134 request_serializer=glclient_dot_scheduler__pb2.RotateOutgoingWebhookSecretRequest.SerializeToString, 135 response_deserializer=glclient_dot_scheduler__pb2.WebhookSecretResponse.FromString, 136 _registered_method=True) 137 self.SignerRequestsStream = channel.stream_stream( 138 '/scheduler.Scheduler/SignerRequestsStream', 139 request_serializer=glclient_dot_scheduler__pb2.SignerResponse.SerializeToString, 140 response_deserializer=glclient_dot_scheduler__pb2.SignerRequest.FromString, 141 _registered_method=True)
The scheduler service is the endpoint which allows users to register a new node with greenlight, recover access to an existing node if the owner lost its credentials, schedule the node to be run on greenlight's infrastructure, and retrieve metadata about the node.
Node
A node is the basic object representing an account on
greenlight. Each node corresponds to a c-lightning instance bound
to a specific network that can be scheduled on greenlight, and must
have a unique node_id
.
Nodes are scheduled on-demand onto the infrastructure, but the time to schedule a node is almost instantaneous.
Authentication
Users are authenticated using mTLS authentication. Applications are
provisioned with an anonymous keypair that is not bound to a node,
allowing access only to the unauthenticated endpoints
Scheduler.GetChallenge
, Scheduler.Register
and
Scheduler.Recover
. This allows them to register or recover a
node, but doesn't give access to the node itself. Upon registering
or recovering an account the user receives a keypair that is bound
to the specific node. Once the user receives their personal mTLS
keypair they may use it to connect to greenlight, and thus get
access to the node-specific functionality. Please refer to the
documentation of your grpc library to learn how to configure grpc
to use the node-specific mTLS keypair.
71 def __init__(self, channel): 72 """Constructor. 73 74 Args: 75 channel: A grpc.Channel. 76 """ 77 self.Register = channel.unary_unary( 78 '/scheduler.Scheduler/Register', 79 request_serializer=glclient_dot_scheduler__pb2.RegistrationRequest.SerializeToString, 80 response_deserializer=glclient_dot_scheduler__pb2.RegistrationResponse.FromString, 81 _registered_method=True) 82 self.Recover = channel.unary_unary( 83 '/scheduler.Scheduler/Recover', 84 request_serializer=glclient_dot_scheduler__pb2.RecoveryRequest.SerializeToString, 85 response_deserializer=glclient_dot_scheduler__pb2.RecoveryResponse.FromString, 86 _registered_method=True) 87 self.GetChallenge = channel.unary_unary( 88 '/scheduler.Scheduler/GetChallenge', 89 request_serializer=glclient_dot_scheduler__pb2.ChallengeRequest.SerializeToString, 90 response_deserializer=glclient_dot_scheduler__pb2.ChallengeResponse.FromString, 91 _registered_method=True) 92 self.Schedule = channel.unary_unary( 93 '/scheduler.Scheduler/Schedule', 94 request_serializer=glclient_dot_scheduler__pb2.ScheduleRequest.SerializeToString, 95 response_deserializer=glclient_dot_scheduler__pb2.NodeInfoResponse.FromString, 96 _registered_method=True) 97 self.GetNodeInfo = channel.unary_unary( 98 '/scheduler.Scheduler/GetNodeInfo', 99 request_serializer=glclient_dot_scheduler__pb2.NodeInfoRequest.SerializeToString, 100 response_deserializer=glclient_dot_scheduler__pb2.NodeInfoResponse.FromString, 101 _registered_method=True) 102 self.MaybeUpgrade = channel.unary_unary( 103 '/scheduler.Scheduler/MaybeUpgrade', 104 request_serializer=glclient_dot_scheduler__pb2.UpgradeRequest.SerializeToString, 105 response_deserializer=glclient_dot_scheduler__pb2.UpgradeResponse.FromString, 106 _registered_method=True) 107 self.ListInviteCodes = channel.unary_unary( 108 '/scheduler.Scheduler/ListInviteCodes', 109 request_serializer=glclient_dot_scheduler__pb2.ListInviteCodesRequest.SerializeToString, 110 response_deserializer=glclient_dot_scheduler__pb2.ListInviteCodesResponse.FromString, 111 _registered_method=True) 112 self.ExportNode = channel.unary_unary( 113 '/scheduler.Scheduler/ExportNode', 114 request_serializer=glclient_dot_scheduler__pb2.ExportNodeRequest.SerializeToString, 115 response_deserializer=glclient_dot_scheduler__pb2.ExportNodeResponse.FromString, 116 _registered_method=True) 117 self.AddOutgoingWebhook = channel.unary_unary( 118 '/scheduler.Scheduler/AddOutgoingWebhook', 119 request_serializer=glclient_dot_scheduler__pb2.AddOutgoingWebhookRequest.SerializeToString, 120 response_deserializer=glclient_dot_scheduler__pb2.AddOutgoingWebhookResponse.FromString, 121 _registered_method=True) 122 self.ListOutgoingWebhooks = channel.unary_unary( 123 '/scheduler.Scheduler/ListOutgoingWebhooks', 124 request_serializer=glclient_dot_scheduler__pb2.ListOutgoingWebhooksRequest.SerializeToString, 125 response_deserializer=glclient_dot_scheduler__pb2.ListOutgoingWebhooksResponse.FromString, 126 _registered_method=True) 127 self.DeleteWebhooks = channel.unary_unary( 128 '/scheduler.Scheduler/DeleteWebhooks', 129 request_serializer=glclient_dot_scheduler__pb2.DeleteOutgoingWebhooksRequest.SerializeToString, 130 response_deserializer=glclient_dot_greenlight__pb2.Empty.FromString, 131 _registered_method=True) 132 self.RotateOutgoingWebhookSecret = channel.unary_unary( 133 '/scheduler.Scheduler/RotateOutgoingWebhookSecret', 134 request_serializer=glclient_dot_scheduler__pb2.RotateOutgoingWebhookSecretRequest.SerializeToString, 135 response_deserializer=glclient_dot_scheduler__pb2.WebhookSecretResponse.FromString, 136 _registered_method=True) 137 self.SignerRequestsStream = channel.stream_stream( 138 '/scheduler.Scheduler/SignerRequestsStream', 139 request_serializer=glclient_dot_scheduler__pb2.SignerResponse.SerializeToString, 140 response_deserializer=glclient_dot_scheduler__pb2.SignerRequest.FromString, 141 _registered_method=True)
Constructor.
Args: channel: A grpc.Channel.
144class SchedulerServicer(object): 145 """The scheduler service is the endpoint which allows users to 146 register a new node with greenlight, recover access to an existing 147 node if the owner lost its credentials, schedule the node to be run 148 on greenlight's infrastructure, and retrieve metadata about the 149 node. 150 151 Node 152 ==== 153 154 A node is the basic object representing an account on 155 greenlight. Each node corresponds to a c-lightning instance bound 156 to a specific network that can be scheduled on greenlight, and must 157 have a unique `node_id`. 158 159 Nodes are scheduled on-demand onto the infrastructure, but the time 160 to schedule a node is almost instantaneous. 161 162 Authentication 163 ============== 164 165 Users are authenticated using mTLS authentication. Applications are 166 provisioned with an anonymous keypair that is not bound to a node, 167 allowing access only to the unauthenticated endpoints 168 `Scheduler.GetChallenge`, `Scheduler.Register` and 169 `Scheduler.Recover`. This allows them to register or recover a 170 node, but doesn't give access to the node itself. Upon registering 171 or recovering an account the user receives a keypair that is bound 172 to the specific node. Once the user receives their personal mTLS 173 keypair they may use it to connect to greenlight, and thus get 174 access to the node-specific functionality. Please refer to the 175 documentation of your grpc library to learn how to configure grpc 176 to use the node-specific mTLS keypair. 177 178 """ 179 180 def Register(self, request, context): 181 """A user may register a new node with greenlight by providing 182 some basic metadata and proving that they have access to 183 the corresponding private key (see challenge-response 184 mechanism below). This means that in order to register a 185 new node the user must have access to the corresponding 186 private keys to prove ownership, and prevent users from 187 just registering arbitrary node_ids without actually 188 knowing the corresponding secrets. 189 190 Upon successful registration an mTLS certificate and 191 private key are returned. These can be used to authenticate 192 future connections to the scheduler or the node. 193 194 Each node may be registered once, any later attempt will 195 result in an error being returned. If the user lost its 196 credentials it can make use of the Recover RPC method to 197 recover the credentials. Notice that this also means that 198 the same node_id cannot be reused for different networks. 199 """ 200 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 201 context.set_details('Method not implemented!') 202 raise NotImplementedError('Method not implemented!') 203 204 def Recover(self, request, context): 205 """Should a user have lost its credentials (mTLS keypair) for 206 any reason, they may regain access to their node using the 207 Recover RPC method. Similar to the initial registration the 208 caller needs to authenticate the call by proving access to 209 the node's secret. This also uses the challenge-response 210 mechanism. 211 212 Upon success a newly generated mTLS certificate and private 213 key are returned, allowing the user to authenticate going 214 forward. Existing keypairs are not revoked, in order to 215 avoid locking out other authenticated applications. 216 """ 217 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 218 context.set_details('Method not implemented!') 219 raise NotImplementedError('Method not implemented!') 220 221 def GetChallenge(self, request, context): 222 """Challenges are one-time values issued by the server, used 223 to authenticate a user/device against the server. A user or 224 device can authenticate to the server by signing the 225 challenge and returning the signed message as part of the 226 request that is to be authenticated. 227 228 Challenges may not be reused, and are bound to the scope 229 they have been issued for. Attempting to reuse a challenge 230 or use a challenge with a different scope will result in an 231 error being returned. 232 """ 233 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 234 context.set_details('Method not implemented!') 235 raise NotImplementedError('Method not implemented!') 236 237 def Schedule(self, request, context): 238 """Scheduling takes a previously registered node, locates a 239 free slot in greenlight's infrastructure and allocates it 240 to run the node. The node then goes through the startup 241 sequence, synchronizing with the blockchain, and finally 242 binding its grpc interface (see Node service below) to a 243 public IP address and port. Access is authenticated via the 244 mTLS keypair the user received from registering or 245 recovering the node. 246 247 Upon success a NodeInfoResponse containing the grpc 248 connection details and some metadata is returned. The 249 application must use the grpc details and its node-specific 250 mTLS keypair to interact with the node directly. 251 """ 252 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 253 context.set_details('Method not implemented!') 254 raise NotImplementedError('Method not implemented!') 255 256 def GetNodeInfo(self, request, context): 257 """Much like `Schedule` this call is used to retrieve the 258 metadata and grpc details of a node. Unlike the other call 259 however it is passive, and will not result in the node 260 being scheduled if it isn't already running. This can be 261 used to check if a node is already scheduled, or to wait 262 for it to be scheduled (e.g., if the caller is an `hsmd` 263 that signs off on changes, but doesn't want to keep the 264 node itself scheduled). 265 """ 266 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 267 context.set_details('Method not implemented!') 268 raise NotImplementedError('Method not implemented!') 269 270 def MaybeUpgrade(self, request, context): 271 """The signer may want to trigger an upgrade of the node 272 before waiting for the node to be scheduled. This ensures 273 that the signer version is in sync with the node 274 version. The scheduler may decide to defer upgrading if the 275 protocols are compatible. Please do not use this directly, 276 rather use the Signer in the client library to trigger this 277 automatically when required. Posting an incomplete or 278 non-functional UpgradeRequest may result in unschedulable 279 nodes. 280 """ 281 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 282 context.set_details('Method not implemented!') 283 raise NotImplementedError('Method not implemented!') 284 285 def ListInviteCodes(self, request, context): 286 """This call is used to fetch a list of invite codes associated 287 with the node id of the client. These invite codes can be used 288 for further registration of new nodes. 289 """ 290 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 291 context.set_details('Method not implemented!') 292 raise NotImplementedError('Method not implemented!') 293 294 def ExportNode(self, request, context): 295 """Exporting a node allows users to take control of their node 296 297 This method initiates the node export on Greenlight, 298 allowing users to offboard from GL into their own 299 infrastructure. After calling this method the node will no 300 longer be schedulable on Greenlight, since it is never safe 301 to assume there haven't been changes in the node's state 302 (see CLN Backups documentation for details). `ExportNode` 303 marks the node as `Exporting`, then generates an encryption 304 secret which is then used to encrypt a database 305 backup. This encrypted database backup is then made 306 accessible through an HTTP server, and a link to it is 307 returned as a response to `ExportNode`. After the export 308 completes the node is marked as `Exported`. The encryption 309 key can then be derived using the signer, using ECDH, 310 allowing only users with the node secret to decrypt it. 311 312 `ExportNode` is idempotent and may be called multiple 313 times, without causing the node to be re-exported multiple 314 times, should the call or the download be interrupted. DO 315 NOT import the backup multiple times into your 316 infrastructure, as that can lead to dataloss (old state 317 being replayed) and loss of funds (see CLN Backups 318 documentation for more information) 319 """ 320 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 321 context.set_details('Method not implemented!') 322 raise NotImplementedError('Method not implemented!') 323 324 def AddOutgoingWebhook(self, request, context): 325 """Missing associated documentation comment in .proto file.""" 326 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 327 context.set_details('Method not implemented!') 328 raise NotImplementedError('Method not implemented!') 329 330 def ListOutgoingWebhooks(self, request, context): 331 """Missing associated documentation comment in .proto file.""" 332 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 333 context.set_details('Method not implemented!') 334 raise NotImplementedError('Method not implemented!') 335 336 def DeleteWebhooks(self, request, context): 337 """Missing associated documentation comment in .proto file.""" 338 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 339 context.set_details('Method not implemented!') 340 raise NotImplementedError('Method not implemented!') 341 342 def RotateOutgoingWebhookSecret(self, request, context): 343 """Missing associated documentation comment in .proto file.""" 344 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 345 context.set_details('Method not implemented!') 346 raise NotImplementedError('Method not implemented!') 347 348 def SignerRequestsStream(self, request_iterator, context): 349 """Attaches a Signer via a bidirectional stream to the scheduler. 350 This is a communication channel between greenlight and the signing 351 device that is used for requests that are not part of the node api. 352 353 The stream is used to hand out the ApprovePairingRequests that 354 the signer answers with a ApprovePairingResponse. 355 """ 356 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 357 context.set_details('Method not implemented!') 358 raise NotImplementedError('Method not implemented!')
The scheduler service is the endpoint which allows users to register a new node with greenlight, recover access to an existing node if the owner lost its credentials, schedule the node to be run on greenlight's infrastructure, and retrieve metadata about the node.
Node
A node is the basic object representing an account on
greenlight. Each node corresponds to a c-lightning instance bound
to a specific network that can be scheduled on greenlight, and must
have a unique node_id
.
Nodes are scheduled on-demand onto the infrastructure, but the time to schedule a node is almost instantaneous.
Authentication
Users are authenticated using mTLS authentication. Applications are
provisioned with an anonymous keypair that is not bound to a node,
allowing access only to the unauthenticated endpoints
Scheduler.GetChallenge
, Scheduler.Register
and
Scheduler.Recover
. This allows them to register or recover a
node, but doesn't give access to the node itself. Upon registering
or recovering an account the user receives a keypair that is bound
to the specific node. Once the user receives their personal mTLS
keypair they may use it to connect to greenlight, and thus get
access to the node-specific functionality. Please refer to the
documentation of your grpc library to learn how to configure grpc
to use the node-specific mTLS keypair.
180 def Register(self, request, context): 181 """A user may register a new node with greenlight by providing 182 some basic metadata and proving that they have access to 183 the corresponding private key (see challenge-response 184 mechanism below). This means that in order to register a 185 new node the user must have access to the corresponding 186 private keys to prove ownership, and prevent users from 187 just registering arbitrary node_ids without actually 188 knowing the corresponding secrets. 189 190 Upon successful registration an mTLS certificate and 191 private key are returned. These can be used to authenticate 192 future connections to the scheduler or the node. 193 194 Each node may be registered once, any later attempt will 195 result in an error being returned. If the user lost its 196 credentials it can make use of the Recover RPC method to 197 recover the credentials. Notice that this also means that 198 the same node_id cannot be reused for different networks. 199 """ 200 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 201 context.set_details('Method not implemented!') 202 raise NotImplementedError('Method not implemented!')
A user may register a new node with greenlight by providing some basic metadata and proving that they have access to the corresponding private key (see challenge-response mechanism below). This means that in order to register a new node the user must have access to the corresponding private keys to prove ownership, and prevent users from just registering arbitrary node_ids without actually knowing the corresponding secrets.
Upon successful registration an mTLS certificate and private key are returned. These can be used to authenticate future connections to the scheduler or the node.
Each node may be registered once, any later attempt will result in an error being returned. If the user lost its credentials it can make use of the Recover RPC method to recover the credentials. Notice that this also means that the same node_id cannot be reused for different networks.
204 def Recover(self, request, context): 205 """Should a user have lost its credentials (mTLS keypair) for 206 any reason, they may regain access to their node using the 207 Recover RPC method. Similar to the initial registration the 208 caller needs to authenticate the call by proving access to 209 the node's secret. This also uses the challenge-response 210 mechanism. 211 212 Upon success a newly generated mTLS certificate and private 213 key are returned, allowing the user to authenticate going 214 forward. Existing keypairs are not revoked, in order to 215 avoid locking out other authenticated applications. 216 """ 217 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 218 context.set_details('Method not implemented!') 219 raise NotImplementedError('Method not implemented!')
Should a user have lost its credentials (mTLS keypair) for any reason, they may regain access to their node using the Recover RPC method. Similar to the initial registration the caller needs to authenticate the call by proving access to the node's secret. This also uses the challenge-response mechanism.
Upon success a newly generated mTLS certificate and private key are returned, allowing the user to authenticate going forward. Existing keypairs are not revoked, in order to avoid locking out other authenticated applications.
221 def GetChallenge(self, request, context): 222 """Challenges are one-time values issued by the server, used 223 to authenticate a user/device against the server. A user or 224 device can authenticate to the server by signing the 225 challenge and returning the signed message as part of the 226 request that is to be authenticated. 227 228 Challenges may not be reused, and are bound to the scope 229 they have been issued for. Attempting to reuse a challenge 230 or use a challenge with a different scope will result in an 231 error being returned. 232 """ 233 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 234 context.set_details('Method not implemented!') 235 raise NotImplementedError('Method not implemented!')
Challenges are one-time values issued by the server, used to authenticate a user/device against the server. A user or device can authenticate to the server by signing the challenge and returning the signed message as part of the request that is to be authenticated.
Challenges may not be reused, and are bound to the scope they have been issued for. Attempting to reuse a challenge or use a challenge with a different scope will result in an error being returned.
237 def Schedule(self, request, context): 238 """Scheduling takes a previously registered node, locates a 239 free slot in greenlight's infrastructure and allocates it 240 to run the node. The node then goes through the startup 241 sequence, synchronizing with the blockchain, and finally 242 binding its grpc interface (see Node service below) to a 243 public IP address and port. Access is authenticated via the 244 mTLS keypair the user received from registering or 245 recovering the node. 246 247 Upon success a NodeInfoResponse containing the grpc 248 connection details and some metadata is returned. The 249 application must use the grpc details and its node-specific 250 mTLS keypair to interact with the node directly. 251 """ 252 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 253 context.set_details('Method not implemented!') 254 raise NotImplementedError('Method not implemented!')
Scheduling takes a previously registered node, locates a free slot in greenlight's infrastructure and allocates it to run the node. The node then goes through the startup sequence, synchronizing with the blockchain, and finally binding its grpc interface (see Node service below) to a public IP address and port. Access is authenticated via the mTLS keypair the user received from registering or recovering the node.
Upon success a NodeInfoResponse containing the grpc connection details and some metadata is returned. The application must use the grpc details and its node-specific mTLS keypair to interact with the node directly.
256 def GetNodeInfo(self, request, context): 257 """Much like `Schedule` this call is used to retrieve the 258 metadata and grpc details of a node. Unlike the other call 259 however it is passive, and will not result in the node 260 being scheduled if it isn't already running. This can be 261 used to check if a node is already scheduled, or to wait 262 for it to be scheduled (e.g., if the caller is an `hsmd` 263 that signs off on changes, but doesn't want to keep the 264 node itself scheduled). 265 """ 266 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 267 context.set_details('Method not implemented!') 268 raise NotImplementedError('Method not implemented!')
Much like Schedule
this call is used to retrieve the
metadata and grpc details of a node. Unlike the other call
however it is passive, and will not result in the node
being scheduled if it isn't already running. This can be
used to check if a node is already scheduled, or to wait
for it to be scheduled (e.g., if the caller is an hsmd
that signs off on changes, but doesn't want to keep the
node itself scheduled).
270 def MaybeUpgrade(self, request, context): 271 """The signer may want to trigger an upgrade of the node 272 before waiting for the node to be scheduled. This ensures 273 that the signer version is in sync with the node 274 version. The scheduler may decide to defer upgrading if the 275 protocols are compatible. Please do not use this directly, 276 rather use the Signer in the client library to trigger this 277 automatically when required. Posting an incomplete or 278 non-functional UpgradeRequest may result in unschedulable 279 nodes. 280 """ 281 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 282 context.set_details('Method not implemented!') 283 raise NotImplementedError('Method not implemented!')
The signer may want to trigger an upgrade of the node before waiting for the node to be scheduled. This ensures that the signer version is in sync with the node version. The scheduler may decide to defer upgrading if the protocols are compatible. Please do not use this directly, rather use the Signer in the client library to trigger this automatically when required. Posting an incomplete or non-functional UpgradeRequest may result in unschedulable nodes.
285 def ListInviteCodes(self, request, context): 286 """This call is used to fetch a list of invite codes associated 287 with the node id of the client. These invite codes can be used 288 for further registration of new nodes. 289 """ 290 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 291 context.set_details('Method not implemented!') 292 raise NotImplementedError('Method not implemented!')
This call is used to fetch a list of invite codes associated with the node id of the client. These invite codes can be used for further registration of new nodes.
294 def ExportNode(self, request, context): 295 """Exporting a node allows users to take control of their node 296 297 This method initiates the node export on Greenlight, 298 allowing users to offboard from GL into their own 299 infrastructure. After calling this method the node will no 300 longer be schedulable on Greenlight, since it is never safe 301 to assume there haven't been changes in the node's state 302 (see CLN Backups documentation for details). `ExportNode` 303 marks the node as `Exporting`, then generates an encryption 304 secret which is then used to encrypt a database 305 backup. This encrypted database backup is then made 306 accessible through an HTTP server, and a link to it is 307 returned as a response to `ExportNode`. After the export 308 completes the node is marked as `Exported`. The encryption 309 key can then be derived using the signer, using ECDH, 310 allowing only users with the node secret to decrypt it. 311 312 `ExportNode` is idempotent and may be called multiple 313 times, without causing the node to be re-exported multiple 314 times, should the call or the download be interrupted. DO 315 NOT import the backup multiple times into your 316 infrastructure, as that can lead to dataloss (old state 317 being replayed) and loss of funds (see CLN Backups 318 documentation for more information) 319 """ 320 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 321 context.set_details('Method not implemented!') 322 raise NotImplementedError('Method not implemented!')
Exporting a node allows users to take control of their node
This method initiates the node export on Greenlight,
allowing users to offboard from GL into their own
infrastructure. After calling this method the node will no
longer be schedulable on Greenlight, since it is never safe
to assume there haven't been changes in the node's state
(see CLN Backups documentation for details). ExportNode
marks the node as Exporting
, then generates an encryption
secret which is then used to encrypt a database
backup. This encrypted database backup is then made
accessible through an HTTP server, and a link to it is
returned as a response to ExportNode
. After the export
completes the node is marked as Exported
. The encryption
key can then be derived using the signer, using ECDH,
allowing only users with the node secret to decrypt it.
ExportNode
is idempotent and may be called multiple
times, without causing the node to be re-exported multiple
times, should the call or the download be interrupted. DO
NOT import the backup multiple times into your
infrastructure, as that can lead to dataloss (old state
being replayed) and loss of funds (see CLN Backups
documentation for more information)
324 def AddOutgoingWebhook(self, request, context): 325 """Missing associated documentation comment in .proto file.""" 326 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 327 context.set_details('Method not implemented!') 328 raise NotImplementedError('Method not implemented!')
Missing associated documentation comment in .proto file.
330 def ListOutgoingWebhooks(self, request, context): 331 """Missing associated documentation comment in .proto file.""" 332 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 333 context.set_details('Method not implemented!') 334 raise NotImplementedError('Method not implemented!')
Missing associated documentation comment in .proto file.
336 def DeleteWebhooks(self, request, context): 337 """Missing associated documentation comment in .proto file.""" 338 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 339 context.set_details('Method not implemented!') 340 raise NotImplementedError('Method not implemented!')
Missing associated documentation comment in .proto file.
342 def RotateOutgoingWebhookSecret(self, request, context): 343 """Missing associated documentation comment in .proto file.""" 344 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 345 context.set_details('Method not implemented!') 346 raise NotImplementedError('Method not implemented!')
Missing associated documentation comment in .proto file.
348 def SignerRequestsStream(self, request_iterator, context): 349 """Attaches a Signer via a bidirectional stream to the scheduler. 350 This is a communication channel between greenlight and the signing 351 device that is used for requests that are not part of the node api. 352 353 The stream is used to hand out the ApprovePairingRequests that 354 the signer answers with a ApprovePairingResponse. 355 """ 356 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 357 context.set_details('Method not implemented!') 358 raise NotImplementedError('Method not implemented!')
Attaches a Signer via a bidirectional stream to the scheduler. This is a communication channel between greenlight and the signing device that is used for requests that are not part of the node api.
The stream is used to hand out the ApprovePairingRequests that the signer answers with a ApprovePairingResponse.
361def add_SchedulerServicer_to_server(servicer, server): 362 rpc_method_handlers = { 363 'Register': grpc.unary_unary_rpc_method_handler( 364 servicer.Register, 365 request_deserializer=glclient_dot_scheduler__pb2.RegistrationRequest.FromString, 366 response_serializer=glclient_dot_scheduler__pb2.RegistrationResponse.SerializeToString, 367 ), 368 'Recover': grpc.unary_unary_rpc_method_handler( 369 servicer.Recover, 370 request_deserializer=glclient_dot_scheduler__pb2.RecoveryRequest.FromString, 371 response_serializer=glclient_dot_scheduler__pb2.RecoveryResponse.SerializeToString, 372 ), 373 'GetChallenge': grpc.unary_unary_rpc_method_handler( 374 servicer.GetChallenge, 375 request_deserializer=glclient_dot_scheduler__pb2.ChallengeRequest.FromString, 376 response_serializer=glclient_dot_scheduler__pb2.ChallengeResponse.SerializeToString, 377 ), 378 'Schedule': grpc.unary_unary_rpc_method_handler( 379 servicer.Schedule, 380 request_deserializer=glclient_dot_scheduler__pb2.ScheduleRequest.FromString, 381 response_serializer=glclient_dot_scheduler__pb2.NodeInfoResponse.SerializeToString, 382 ), 383 'GetNodeInfo': grpc.unary_unary_rpc_method_handler( 384 servicer.GetNodeInfo, 385 request_deserializer=glclient_dot_scheduler__pb2.NodeInfoRequest.FromString, 386 response_serializer=glclient_dot_scheduler__pb2.NodeInfoResponse.SerializeToString, 387 ), 388 'MaybeUpgrade': grpc.unary_unary_rpc_method_handler( 389 servicer.MaybeUpgrade, 390 request_deserializer=glclient_dot_scheduler__pb2.UpgradeRequest.FromString, 391 response_serializer=glclient_dot_scheduler__pb2.UpgradeResponse.SerializeToString, 392 ), 393 'ListInviteCodes': grpc.unary_unary_rpc_method_handler( 394 servicer.ListInviteCodes, 395 request_deserializer=glclient_dot_scheduler__pb2.ListInviteCodesRequest.FromString, 396 response_serializer=glclient_dot_scheduler__pb2.ListInviteCodesResponse.SerializeToString, 397 ), 398 'ExportNode': grpc.unary_unary_rpc_method_handler( 399 servicer.ExportNode, 400 request_deserializer=glclient_dot_scheduler__pb2.ExportNodeRequest.FromString, 401 response_serializer=glclient_dot_scheduler__pb2.ExportNodeResponse.SerializeToString, 402 ), 403 'AddOutgoingWebhook': grpc.unary_unary_rpc_method_handler( 404 servicer.AddOutgoingWebhook, 405 request_deserializer=glclient_dot_scheduler__pb2.AddOutgoingWebhookRequest.FromString, 406 response_serializer=glclient_dot_scheduler__pb2.AddOutgoingWebhookResponse.SerializeToString, 407 ), 408 'ListOutgoingWebhooks': grpc.unary_unary_rpc_method_handler( 409 servicer.ListOutgoingWebhooks, 410 request_deserializer=glclient_dot_scheduler__pb2.ListOutgoingWebhooksRequest.FromString, 411 response_serializer=glclient_dot_scheduler__pb2.ListOutgoingWebhooksResponse.SerializeToString, 412 ), 413 'DeleteWebhooks': grpc.unary_unary_rpc_method_handler( 414 servicer.DeleteWebhooks, 415 request_deserializer=glclient_dot_scheduler__pb2.DeleteOutgoingWebhooksRequest.FromString, 416 response_serializer=glclient_dot_greenlight__pb2.Empty.SerializeToString, 417 ), 418 'RotateOutgoingWebhookSecret': grpc.unary_unary_rpc_method_handler( 419 servicer.RotateOutgoingWebhookSecret, 420 request_deserializer=glclient_dot_scheduler__pb2.RotateOutgoingWebhookSecretRequest.FromString, 421 response_serializer=glclient_dot_scheduler__pb2.WebhookSecretResponse.SerializeToString, 422 ), 423 'SignerRequestsStream': grpc.stream_stream_rpc_method_handler( 424 servicer.SignerRequestsStream, 425 request_deserializer=glclient_dot_scheduler__pb2.SignerResponse.FromString, 426 response_serializer=glclient_dot_scheduler__pb2.SignerRequest.SerializeToString, 427 ), 428 } 429 generic_handler = grpc.method_handlers_generic_handler( 430 'scheduler.Scheduler', rpc_method_handlers) 431 server.add_generic_rpc_handlers((generic_handler,)) 432 server.add_registered_method_handlers('scheduler.Scheduler', rpc_method_handlers)
436class Scheduler(object): 437 """The scheduler service is the endpoint which allows users to 438 register a new node with greenlight, recover access to an existing 439 node if the owner lost its credentials, schedule the node to be run 440 on greenlight's infrastructure, and retrieve metadata about the 441 node. 442 443 Node 444 ==== 445 446 A node is the basic object representing an account on 447 greenlight. Each node corresponds to a c-lightning instance bound 448 to a specific network that can be scheduled on greenlight, and must 449 have a unique `node_id`. 450 451 Nodes are scheduled on-demand onto the infrastructure, but the time 452 to schedule a node is almost instantaneous. 453 454 Authentication 455 ============== 456 457 Users are authenticated using mTLS authentication. Applications are 458 provisioned with an anonymous keypair that is not bound to a node, 459 allowing access only to the unauthenticated endpoints 460 `Scheduler.GetChallenge`, `Scheduler.Register` and 461 `Scheduler.Recover`. This allows them to register or recover a 462 node, but doesn't give access to the node itself. Upon registering 463 or recovering an account the user receives a keypair that is bound 464 to the specific node. Once the user receives their personal mTLS 465 keypair they may use it to connect to greenlight, and thus get 466 access to the node-specific functionality. Please refer to the 467 documentation of your grpc library to learn how to configure grpc 468 to use the node-specific mTLS keypair. 469 470 """ 471 472 @staticmethod 473 def Register(request, 474 target, 475 options=(), 476 channel_credentials=None, 477 call_credentials=None, 478 insecure=False, 479 compression=None, 480 wait_for_ready=None, 481 timeout=None, 482 metadata=None): 483 return grpc.experimental.unary_unary( 484 request, 485 target, 486 '/scheduler.Scheduler/Register', 487 glclient_dot_scheduler__pb2.RegistrationRequest.SerializeToString, 488 glclient_dot_scheduler__pb2.RegistrationResponse.FromString, 489 options, 490 channel_credentials, 491 insecure, 492 call_credentials, 493 compression, 494 wait_for_ready, 495 timeout, 496 metadata, 497 _registered_method=True) 498 499 @staticmethod 500 def Recover(request, 501 target, 502 options=(), 503 channel_credentials=None, 504 call_credentials=None, 505 insecure=False, 506 compression=None, 507 wait_for_ready=None, 508 timeout=None, 509 metadata=None): 510 return grpc.experimental.unary_unary( 511 request, 512 target, 513 '/scheduler.Scheduler/Recover', 514 glclient_dot_scheduler__pb2.RecoveryRequest.SerializeToString, 515 glclient_dot_scheduler__pb2.RecoveryResponse.FromString, 516 options, 517 channel_credentials, 518 insecure, 519 call_credentials, 520 compression, 521 wait_for_ready, 522 timeout, 523 metadata, 524 _registered_method=True) 525 526 @staticmethod 527 def GetChallenge(request, 528 target, 529 options=(), 530 channel_credentials=None, 531 call_credentials=None, 532 insecure=False, 533 compression=None, 534 wait_for_ready=None, 535 timeout=None, 536 metadata=None): 537 return grpc.experimental.unary_unary( 538 request, 539 target, 540 '/scheduler.Scheduler/GetChallenge', 541 glclient_dot_scheduler__pb2.ChallengeRequest.SerializeToString, 542 glclient_dot_scheduler__pb2.ChallengeResponse.FromString, 543 options, 544 channel_credentials, 545 insecure, 546 call_credentials, 547 compression, 548 wait_for_ready, 549 timeout, 550 metadata, 551 _registered_method=True) 552 553 @staticmethod 554 def Schedule(request, 555 target, 556 options=(), 557 channel_credentials=None, 558 call_credentials=None, 559 insecure=False, 560 compression=None, 561 wait_for_ready=None, 562 timeout=None, 563 metadata=None): 564 return grpc.experimental.unary_unary( 565 request, 566 target, 567 '/scheduler.Scheduler/Schedule', 568 glclient_dot_scheduler__pb2.ScheduleRequest.SerializeToString, 569 glclient_dot_scheduler__pb2.NodeInfoResponse.FromString, 570 options, 571 channel_credentials, 572 insecure, 573 call_credentials, 574 compression, 575 wait_for_ready, 576 timeout, 577 metadata, 578 _registered_method=True) 579 580 @staticmethod 581 def GetNodeInfo(request, 582 target, 583 options=(), 584 channel_credentials=None, 585 call_credentials=None, 586 insecure=False, 587 compression=None, 588 wait_for_ready=None, 589 timeout=None, 590 metadata=None): 591 return grpc.experimental.unary_unary( 592 request, 593 target, 594 '/scheduler.Scheduler/GetNodeInfo', 595 glclient_dot_scheduler__pb2.NodeInfoRequest.SerializeToString, 596 glclient_dot_scheduler__pb2.NodeInfoResponse.FromString, 597 options, 598 channel_credentials, 599 insecure, 600 call_credentials, 601 compression, 602 wait_for_ready, 603 timeout, 604 metadata, 605 _registered_method=True) 606 607 @staticmethod 608 def MaybeUpgrade(request, 609 target, 610 options=(), 611 channel_credentials=None, 612 call_credentials=None, 613 insecure=False, 614 compression=None, 615 wait_for_ready=None, 616 timeout=None, 617 metadata=None): 618 return grpc.experimental.unary_unary( 619 request, 620 target, 621 '/scheduler.Scheduler/MaybeUpgrade', 622 glclient_dot_scheduler__pb2.UpgradeRequest.SerializeToString, 623 glclient_dot_scheduler__pb2.UpgradeResponse.FromString, 624 options, 625 channel_credentials, 626 insecure, 627 call_credentials, 628 compression, 629 wait_for_ready, 630 timeout, 631 metadata, 632 _registered_method=True) 633 634 @staticmethod 635 def ListInviteCodes(request, 636 target, 637 options=(), 638 channel_credentials=None, 639 call_credentials=None, 640 insecure=False, 641 compression=None, 642 wait_for_ready=None, 643 timeout=None, 644 metadata=None): 645 return grpc.experimental.unary_unary( 646 request, 647 target, 648 '/scheduler.Scheduler/ListInviteCodes', 649 glclient_dot_scheduler__pb2.ListInviteCodesRequest.SerializeToString, 650 glclient_dot_scheduler__pb2.ListInviteCodesResponse.FromString, 651 options, 652 channel_credentials, 653 insecure, 654 call_credentials, 655 compression, 656 wait_for_ready, 657 timeout, 658 metadata, 659 _registered_method=True) 660 661 @staticmethod 662 def ExportNode(request, 663 target, 664 options=(), 665 channel_credentials=None, 666 call_credentials=None, 667 insecure=False, 668 compression=None, 669 wait_for_ready=None, 670 timeout=None, 671 metadata=None): 672 return grpc.experimental.unary_unary( 673 request, 674 target, 675 '/scheduler.Scheduler/ExportNode', 676 glclient_dot_scheduler__pb2.ExportNodeRequest.SerializeToString, 677 glclient_dot_scheduler__pb2.ExportNodeResponse.FromString, 678 options, 679 channel_credentials, 680 insecure, 681 call_credentials, 682 compression, 683 wait_for_ready, 684 timeout, 685 metadata, 686 _registered_method=True) 687 688 @staticmethod 689 def AddOutgoingWebhook(request, 690 target, 691 options=(), 692 channel_credentials=None, 693 call_credentials=None, 694 insecure=False, 695 compression=None, 696 wait_for_ready=None, 697 timeout=None, 698 metadata=None): 699 return grpc.experimental.unary_unary( 700 request, 701 target, 702 '/scheduler.Scheduler/AddOutgoingWebhook', 703 glclient_dot_scheduler__pb2.AddOutgoingWebhookRequest.SerializeToString, 704 glclient_dot_scheduler__pb2.AddOutgoingWebhookResponse.FromString, 705 options, 706 channel_credentials, 707 insecure, 708 call_credentials, 709 compression, 710 wait_for_ready, 711 timeout, 712 metadata, 713 _registered_method=True) 714 715 @staticmethod 716 def ListOutgoingWebhooks(request, 717 target, 718 options=(), 719 channel_credentials=None, 720 call_credentials=None, 721 insecure=False, 722 compression=None, 723 wait_for_ready=None, 724 timeout=None, 725 metadata=None): 726 return grpc.experimental.unary_unary( 727 request, 728 target, 729 '/scheduler.Scheduler/ListOutgoingWebhooks', 730 glclient_dot_scheduler__pb2.ListOutgoingWebhooksRequest.SerializeToString, 731 glclient_dot_scheduler__pb2.ListOutgoingWebhooksResponse.FromString, 732 options, 733 channel_credentials, 734 insecure, 735 call_credentials, 736 compression, 737 wait_for_ready, 738 timeout, 739 metadata, 740 _registered_method=True) 741 742 @staticmethod 743 def DeleteWebhooks(request, 744 target, 745 options=(), 746 channel_credentials=None, 747 call_credentials=None, 748 insecure=False, 749 compression=None, 750 wait_for_ready=None, 751 timeout=None, 752 metadata=None): 753 return grpc.experimental.unary_unary( 754 request, 755 target, 756 '/scheduler.Scheduler/DeleteWebhooks', 757 glclient_dot_scheduler__pb2.DeleteOutgoingWebhooksRequest.SerializeToString, 758 glclient_dot_greenlight__pb2.Empty.FromString, 759 options, 760 channel_credentials, 761 insecure, 762 call_credentials, 763 compression, 764 wait_for_ready, 765 timeout, 766 metadata, 767 _registered_method=True) 768 769 @staticmethod 770 def RotateOutgoingWebhookSecret(request, 771 target, 772 options=(), 773 channel_credentials=None, 774 call_credentials=None, 775 insecure=False, 776 compression=None, 777 wait_for_ready=None, 778 timeout=None, 779 metadata=None): 780 return grpc.experimental.unary_unary( 781 request, 782 target, 783 '/scheduler.Scheduler/RotateOutgoingWebhookSecret', 784 glclient_dot_scheduler__pb2.RotateOutgoingWebhookSecretRequest.SerializeToString, 785 glclient_dot_scheduler__pb2.WebhookSecretResponse.FromString, 786 options, 787 channel_credentials, 788 insecure, 789 call_credentials, 790 compression, 791 wait_for_ready, 792 timeout, 793 metadata, 794 _registered_method=True) 795 796 @staticmethod 797 def SignerRequestsStream(request_iterator, 798 target, 799 options=(), 800 channel_credentials=None, 801 call_credentials=None, 802 insecure=False, 803 compression=None, 804 wait_for_ready=None, 805 timeout=None, 806 metadata=None): 807 return grpc.experimental.stream_stream( 808 request_iterator, 809 target, 810 '/scheduler.Scheduler/SignerRequestsStream', 811 glclient_dot_scheduler__pb2.SignerResponse.SerializeToString, 812 glclient_dot_scheduler__pb2.SignerRequest.FromString, 813 options, 814 channel_credentials, 815 insecure, 816 call_credentials, 817 compression, 818 wait_for_ready, 819 timeout, 820 metadata, 821 _registered_method=True)
The scheduler service is the endpoint which allows users to register a new node with greenlight, recover access to an existing node if the owner lost its credentials, schedule the node to be run on greenlight's infrastructure, and retrieve metadata about the node.
Node
A node is the basic object representing an account on
greenlight. Each node corresponds to a c-lightning instance bound
to a specific network that can be scheduled on greenlight, and must
have a unique node_id
.
Nodes are scheduled on-demand onto the infrastructure, but the time to schedule a node is almost instantaneous.
Authentication
Users are authenticated using mTLS authentication. Applications are
provisioned with an anonymous keypair that is not bound to a node,
allowing access only to the unauthenticated endpoints
Scheduler.GetChallenge
, Scheduler.Register
and
Scheduler.Recover
. This allows them to register or recover a
node, but doesn't give access to the node itself. Upon registering
or recovering an account the user receives a keypair that is bound
to the specific node. Once the user receives their personal mTLS
keypair they may use it to connect to greenlight, and thus get
access to the node-specific functionality. Please refer to the
documentation of your grpc library to learn how to configure grpc
to use the node-specific mTLS keypair.
472 @staticmethod 473 def Register(request, 474 target, 475 options=(), 476 channel_credentials=None, 477 call_credentials=None, 478 insecure=False, 479 compression=None, 480 wait_for_ready=None, 481 timeout=None, 482 metadata=None): 483 return grpc.experimental.unary_unary( 484 request, 485 target, 486 '/scheduler.Scheduler/Register', 487 glclient_dot_scheduler__pb2.RegistrationRequest.SerializeToString, 488 glclient_dot_scheduler__pb2.RegistrationResponse.FromString, 489 options, 490 channel_credentials, 491 insecure, 492 call_credentials, 493 compression, 494 wait_for_ready, 495 timeout, 496 metadata, 497 _registered_method=True)
499 @staticmethod 500 def Recover(request, 501 target, 502 options=(), 503 channel_credentials=None, 504 call_credentials=None, 505 insecure=False, 506 compression=None, 507 wait_for_ready=None, 508 timeout=None, 509 metadata=None): 510 return grpc.experimental.unary_unary( 511 request, 512 target, 513 '/scheduler.Scheduler/Recover', 514 glclient_dot_scheduler__pb2.RecoveryRequest.SerializeToString, 515 glclient_dot_scheduler__pb2.RecoveryResponse.FromString, 516 options, 517 channel_credentials, 518 insecure, 519 call_credentials, 520 compression, 521 wait_for_ready, 522 timeout, 523 metadata, 524 _registered_method=True)
526 @staticmethod 527 def GetChallenge(request, 528 target, 529 options=(), 530 channel_credentials=None, 531 call_credentials=None, 532 insecure=False, 533 compression=None, 534 wait_for_ready=None, 535 timeout=None, 536 metadata=None): 537 return grpc.experimental.unary_unary( 538 request, 539 target, 540 '/scheduler.Scheduler/GetChallenge', 541 glclient_dot_scheduler__pb2.ChallengeRequest.SerializeToString, 542 glclient_dot_scheduler__pb2.ChallengeResponse.FromString, 543 options, 544 channel_credentials, 545 insecure, 546 call_credentials, 547 compression, 548 wait_for_ready, 549 timeout, 550 metadata, 551 _registered_method=True)
553 @staticmethod 554 def Schedule(request, 555 target, 556 options=(), 557 channel_credentials=None, 558 call_credentials=None, 559 insecure=False, 560 compression=None, 561 wait_for_ready=None, 562 timeout=None, 563 metadata=None): 564 return grpc.experimental.unary_unary( 565 request, 566 target, 567 '/scheduler.Scheduler/Schedule', 568 glclient_dot_scheduler__pb2.ScheduleRequest.SerializeToString, 569 glclient_dot_scheduler__pb2.NodeInfoResponse.FromString, 570 options, 571 channel_credentials, 572 insecure, 573 call_credentials, 574 compression, 575 wait_for_ready, 576 timeout, 577 metadata, 578 _registered_method=True)
580 @staticmethod 581 def GetNodeInfo(request, 582 target, 583 options=(), 584 channel_credentials=None, 585 call_credentials=None, 586 insecure=False, 587 compression=None, 588 wait_for_ready=None, 589 timeout=None, 590 metadata=None): 591 return grpc.experimental.unary_unary( 592 request, 593 target, 594 '/scheduler.Scheduler/GetNodeInfo', 595 glclient_dot_scheduler__pb2.NodeInfoRequest.SerializeToString, 596 glclient_dot_scheduler__pb2.NodeInfoResponse.FromString, 597 options, 598 channel_credentials, 599 insecure, 600 call_credentials, 601 compression, 602 wait_for_ready, 603 timeout, 604 metadata, 605 _registered_method=True)
607 @staticmethod 608 def MaybeUpgrade(request, 609 target, 610 options=(), 611 channel_credentials=None, 612 call_credentials=None, 613 insecure=False, 614 compression=None, 615 wait_for_ready=None, 616 timeout=None, 617 metadata=None): 618 return grpc.experimental.unary_unary( 619 request, 620 target, 621 '/scheduler.Scheduler/MaybeUpgrade', 622 glclient_dot_scheduler__pb2.UpgradeRequest.SerializeToString, 623 glclient_dot_scheduler__pb2.UpgradeResponse.FromString, 624 options, 625 channel_credentials, 626 insecure, 627 call_credentials, 628 compression, 629 wait_for_ready, 630 timeout, 631 metadata, 632 _registered_method=True)
634 @staticmethod 635 def ListInviteCodes(request, 636 target, 637 options=(), 638 channel_credentials=None, 639 call_credentials=None, 640 insecure=False, 641 compression=None, 642 wait_for_ready=None, 643 timeout=None, 644 metadata=None): 645 return grpc.experimental.unary_unary( 646 request, 647 target, 648 '/scheduler.Scheduler/ListInviteCodes', 649 glclient_dot_scheduler__pb2.ListInviteCodesRequest.SerializeToString, 650 glclient_dot_scheduler__pb2.ListInviteCodesResponse.FromString, 651 options, 652 channel_credentials, 653 insecure, 654 call_credentials, 655 compression, 656 wait_for_ready, 657 timeout, 658 metadata, 659 _registered_method=True)
661 @staticmethod 662 def ExportNode(request, 663 target, 664 options=(), 665 channel_credentials=None, 666 call_credentials=None, 667 insecure=False, 668 compression=None, 669 wait_for_ready=None, 670 timeout=None, 671 metadata=None): 672 return grpc.experimental.unary_unary( 673 request, 674 target, 675 '/scheduler.Scheduler/ExportNode', 676 glclient_dot_scheduler__pb2.ExportNodeRequest.SerializeToString, 677 glclient_dot_scheduler__pb2.ExportNodeResponse.FromString, 678 options, 679 channel_credentials, 680 insecure, 681 call_credentials, 682 compression, 683 wait_for_ready, 684 timeout, 685 metadata, 686 _registered_method=True)
688 @staticmethod 689 def AddOutgoingWebhook(request, 690 target, 691 options=(), 692 channel_credentials=None, 693 call_credentials=None, 694 insecure=False, 695 compression=None, 696 wait_for_ready=None, 697 timeout=None, 698 metadata=None): 699 return grpc.experimental.unary_unary( 700 request, 701 target, 702 '/scheduler.Scheduler/AddOutgoingWebhook', 703 glclient_dot_scheduler__pb2.AddOutgoingWebhookRequest.SerializeToString, 704 glclient_dot_scheduler__pb2.AddOutgoingWebhookResponse.FromString, 705 options, 706 channel_credentials, 707 insecure, 708 call_credentials, 709 compression, 710 wait_for_ready, 711 timeout, 712 metadata, 713 _registered_method=True)
715 @staticmethod 716 def ListOutgoingWebhooks(request, 717 target, 718 options=(), 719 channel_credentials=None, 720 call_credentials=None, 721 insecure=False, 722 compression=None, 723 wait_for_ready=None, 724 timeout=None, 725 metadata=None): 726 return grpc.experimental.unary_unary( 727 request, 728 target, 729 '/scheduler.Scheduler/ListOutgoingWebhooks', 730 glclient_dot_scheduler__pb2.ListOutgoingWebhooksRequest.SerializeToString, 731 glclient_dot_scheduler__pb2.ListOutgoingWebhooksResponse.FromString, 732 options, 733 channel_credentials, 734 insecure, 735 call_credentials, 736 compression, 737 wait_for_ready, 738 timeout, 739 metadata, 740 _registered_method=True)
742 @staticmethod 743 def DeleteWebhooks(request, 744 target, 745 options=(), 746 channel_credentials=None, 747 call_credentials=None, 748 insecure=False, 749 compression=None, 750 wait_for_ready=None, 751 timeout=None, 752 metadata=None): 753 return grpc.experimental.unary_unary( 754 request, 755 target, 756 '/scheduler.Scheduler/DeleteWebhooks', 757 glclient_dot_scheduler__pb2.DeleteOutgoingWebhooksRequest.SerializeToString, 758 glclient_dot_greenlight__pb2.Empty.FromString, 759 options, 760 channel_credentials, 761 insecure, 762 call_credentials, 763 compression, 764 wait_for_ready, 765 timeout, 766 metadata, 767 _registered_method=True)
769 @staticmethod 770 def RotateOutgoingWebhookSecret(request, 771 target, 772 options=(), 773 channel_credentials=None, 774 call_credentials=None, 775 insecure=False, 776 compression=None, 777 wait_for_ready=None, 778 timeout=None, 779 metadata=None): 780 return grpc.experimental.unary_unary( 781 request, 782 target, 783 '/scheduler.Scheduler/RotateOutgoingWebhookSecret', 784 glclient_dot_scheduler__pb2.RotateOutgoingWebhookSecretRequest.SerializeToString, 785 glclient_dot_scheduler__pb2.WebhookSecretResponse.FromString, 786 options, 787 channel_credentials, 788 insecure, 789 call_credentials, 790 compression, 791 wait_for_ready, 792 timeout, 793 metadata, 794 _registered_method=True)
796 @staticmethod 797 def SignerRequestsStream(request_iterator, 798 target, 799 options=(), 800 channel_credentials=None, 801 call_credentials=None, 802 insecure=False, 803 compression=None, 804 wait_for_ready=None, 805 timeout=None, 806 metadata=None): 807 return grpc.experimental.stream_stream( 808 request_iterator, 809 target, 810 '/scheduler.Scheduler/SignerRequestsStream', 811 glclient_dot_scheduler__pb2.SignerResponse.SerializeToString, 812 glclient_dot_scheduler__pb2.SignerRequest.FromString, 813 options, 814 channel_credentials, 815 insecure, 816 call_credentials, 817 compression, 818 wait_for_ready, 819 timeout, 820 metadata, 821 _registered_method=True)
824class DebugStub(object): 825 """A service to collect debugging information from clients. 826 """ 827 828 def __init__(self, channel): 829 """Constructor. 830 831 Args: 832 channel: A grpc.Channel. 833 """ 834 self.ReportSignerRejection = channel.unary_unary( 835 '/scheduler.Debug/ReportSignerRejection', 836 request_serializer=glclient_dot_scheduler__pb2.SignerRejection.SerializeToString, 837 response_deserializer=glclient_dot_greenlight__pb2.Empty.FromString, 838 _registered_method=True)
A service to collect debugging information from clients.
828 def __init__(self, channel): 829 """Constructor. 830 831 Args: 832 channel: A grpc.Channel. 833 """ 834 self.ReportSignerRejection = channel.unary_unary( 835 '/scheduler.Debug/ReportSignerRejection', 836 request_serializer=glclient_dot_scheduler__pb2.SignerRejection.SerializeToString, 837 response_deserializer=glclient_dot_greenlight__pb2.Empty.FromString, 838 _registered_method=True)
Constructor.
Args: channel: A grpc.Channel.
841class DebugServicer(object): 842 """A service to collect debugging information from clients. 843 """ 844 845 def ReportSignerRejection(self, request, context): 846 """The signer is designed to fail closed, i.e., we reject requests 847 that do not resolve or that go against one of its policies. This 848 comes with some issues, such as false negatives, where we reject 849 despite the request being valid. As more apps use the API we need 850 to debug these false negatives, hence why we report rejections, 851 so we can investigate the validity of the rejection, and to 852 fine-tine the signer's ruleset. 853 """ 854 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 855 context.set_details('Method not implemented!') 856 raise NotImplementedError('Method not implemented!')
A service to collect debugging information from clients.
845 def ReportSignerRejection(self, request, context): 846 """The signer is designed to fail closed, i.e., we reject requests 847 that do not resolve or that go against one of its policies. This 848 comes with some issues, such as false negatives, where we reject 849 despite the request being valid. As more apps use the API we need 850 to debug these false negatives, hence why we report rejections, 851 so we can investigate the validity of the rejection, and to 852 fine-tine the signer's ruleset. 853 """ 854 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 855 context.set_details('Method not implemented!') 856 raise NotImplementedError('Method not implemented!')
The signer is designed to fail closed, i.e., we reject requests that do not resolve or that go against one of its policies. This comes with some issues, such as false negatives, where we reject despite the request being valid. As more apps use the API we need to debug these false negatives, hence why we report rejections, so we can investigate the validity of the rejection, and to fine-tine the signer's ruleset.
859def add_DebugServicer_to_server(servicer, server): 860 rpc_method_handlers = { 861 'ReportSignerRejection': grpc.unary_unary_rpc_method_handler( 862 servicer.ReportSignerRejection, 863 request_deserializer=glclient_dot_scheduler__pb2.SignerRejection.FromString, 864 response_serializer=glclient_dot_greenlight__pb2.Empty.SerializeToString, 865 ), 866 } 867 generic_handler = grpc.method_handlers_generic_handler( 868 'scheduler.Debug', rpc_method_handlers) 869 server.add_generic_rpc_handlers((generic_handler,)) 870 server.add_registered_method_handlers('scheduler.Debug', rpc_method_handlers)
874class Debug(object): 875 """A service to collect debugging information from clients. 876 """ 877 878 @staticmethod 879 def ReportSignerRejection(request, 880 target, 881 options=(), 882 channel_credentials=None, 883 call_credentials=None, 884 insecure=False, 885 compression=None, 886 wait_for_ready=None, 887 timeout=None, 888 metadata=None): 889 return grpc.experimental.unary_unary( 890 request, 891 target, 892 '/scheduler.Debug/ReportSignerRejection', 893 glclient_dot_scheduler__pb2.SignerRejection.SerializeToString, 894 glclient_dot_greenlight__pb2.Empty.FromString, 895 options, 896 channel_credentials, 897 insecure, 898 call_credentials, 899 compression, 900 wait_for_ready, 901 timeout, 902 metadata, 903 _registered_method=True)
A service to collect debugging information from clients.
878 @staticmethod 879 def ReportSignerRejection(request, 880 target, 881 options=(), 882 channel_credentials=None, 883 call_credentials=None, 884 insecure=False, 885 compression=None, 886 wait_for_ready=None, 887 timeout=None, 888 metadata=None): 889 return grpc.experimental.unary_unary( 890 request, 891 target, 892 '/scheduler.Debug/ReportSignerRejection', 893 glclient_dot_scheduler__pb2.SignerRejection.SerializeToString, 894 glclient_dot_greenlight__pb2.Empty.FromString, 895 options, 896 channel_credentials, 897 insecure, 898 call_credentials, 899 compression, 900 wait_for_ready, 901 timeout, 902 metadata, 903 _registered_method=True)
906class PairingStub(object): 907 """A service to pair signer-less clients with an existing signer. 908 """ 909 910 def __init__(self, channel): 911 """Constructor. 912 913 Args: 914 channel: A grpc.Channel. 915 """ 916 self.PairDevice = channel.unary_unary( 917 '/scheduler.Pairing/PairDevice', 918 request_serializer=glclient_dot_scheduler__pb2.PairDeviceRequest.SerializeToString, 919 response_deserializer=glclient_dot_scheduler__pb2.PairDeviceResponse.FromString, 920 _registered_method=True) 921 self.GetPairingData = channel.unary_unary( 922 '/scheduler.Pairing/GetPairingData', 923 request_serializer=glclient_dot_scheduler__pb2.GetPairingDataRequest.SerializeToString, 924 response_deserializer=glclient_dot_scheduler__pb2.GetPairingDataResponse.FromString, 925 _registered_method=True) 926 self.ApprovePairing = channel.unary_unary( 927 '/scheduler.Pairing/ApprovePairing', 928 request_serializer=glclient_dot_scheduler__pb2.ApprovePairingRequest.SerializeToString, 929 response_deserializer=glclient_dot_greenlight__pb2.Empty.FromString, 930 _registered_method=True)
A service to pair signer-less clients with an existing signer.
910 def __init__(self, channel): 911 """Constructor. 912 913 Args: 914 channel: A grpc.Channel. 915 """ 916 self.PairDevice = channel.unary_unary( 917 '/scheduler.Pairing/PairDevice', 918 request_serializer=glclient_dot_scheduler__pb2.PairDeviceRequest.SerializeToString, 919 response_deserializer=glclient_dot_scheduler__pb2.PairDeviceResponse.FromString, 920 _registered_method=True) 921 self.GetPairingData = channel.unary_unary( 922 '/scheduler.Pairing/GetPairingData', 923 request_serializer=glclient_dot_scheduler__pb2.GetPairingDataRequest.SerializeToString, 924 response_deserializer=glclient_dot_scheduler__pb2.GetPairingDataResponse.FromString, 925 _registered_method=True) 926 self.ApprovePairing = channel.unary_unary( 927 '/scheduler.Pairing/ApprovePairing', 928 request_serializer=glclient_dot_scheduler__pb2.ApprovePairingRequest.SerializeToString, 929 response_deserializer=glclient_dot_greenlight__pb2.Empty.FromString, 930 _registered_method=True)
Constructor.
Args: channel: A grpc.Channel.
933class PairingServicer(object): 934 """A service to pair signer-less clients with an existing signer. 935 """ 936 937 def PairDevice(self, request, context): 938 """Initiates a new Pairing Sessions. This is called by the new 939 device that wants to request a pairing from an existing device. 940 The session lifetime is bound to the stream so closing the 941 stream destroys the session. 942 """ 943 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 944 context.set_details('Method not implemented!') 945 raise NotImplementedError('Method not implemented!') 946 947 def GetPairingData(self, request, context): 948 """Returns the pairing related data that belongs to a pairing 949 session. This is meant to be called from a device that can 950 approve a pairing request, we sometimes call it "old device". 951 """ 952 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 953 context.set_details('Method not implemented!') 954 raise NotImplementedError('Method not implemented!') 955 956 def ApprovePairing(self, request, context): 957 """Approves a pairing request. The ApprovePairingRequest is 958 forwarded to a signer for further processing. 959 """ 960 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 961 context.set_details('Method not implemented!') 962 raise NotImplementedError('Method not implemented!')
A service to pair signer-less clients with an existing signer.
937 def PairDevice(self, request, context): 938 """Initiates a new Pairing Sessions. This is called by the new 939 device that wants to request a pairing from an existing device. 940 The session lifetime is bound to the stream so closing the 941 stream destroys the session. 942 """ 943 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 944 context.set_details('Method not implemented!') 945 raise NotImplementedError('Method not implemented!')
Initiates a new Pairing Sessions. This is called by the new device that wants to request a pairing from an existing device. The session lifetime is bound to the stream so closing the stream destroys the session.
947 def GetPairingData(self, request, context): 948 """Returns the pairing related data that belongs to a pairing 949 session. This is meant to be called from a device that can 950 approve a pairing request, we sometimes call it "old device". 951 """ 952 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 953 context.set_details('Method not implemented!') 954 raise NotImplementedError('Method not implemented!')
Returns the pairing related data that belongs to a pairing session. This is meant to be called from a device that can approve a pairing request, we sometimes call it "old device".
956 def ApprovePairing(self, request, context): 957 """Approves a pairing request. The ApprovePairingRequest is 958 forwarded to a signer for further processing. 959 """ 960 context.set_code(grpc.StatusCode.UNIMPLEMENTED) 961 context.set_details('Method not implemented!') 962 raise NotImplementedError('Method not implemented!')
Approves a pairing request. The ApprovePairingRequest is forwarded to a signer for further processing.
965def add_PairingServicer_to_server(servicer, server): 966 rpc_method_handlers = { 967 'PairDevice': grpc.unary_unary_rpc_method_handler( 968 servicer.PairDevice, 969 request_deserializer=glclient_dot_scheduler__pb2.PairDeviceRequest.FromString, 970 response_serializer=glclient_dot_scheduler__pb2.PairDeviceResponse.SerializeToString, 971 ), 972 'GetPairingData': grpc.unary_unary_rpc_method_handler( 973 servicer.GetPairingData, 974 request_deserializer=glclient_dot_scheduler__pb2.GetPairingDataRequest.FromString, 975 response_serializer=glclient_dot_scheduler__pb2.GetPairingDataResponse.SerializeToString, 976 ), 977 'ApprovePairing': grpc.unary_unary_rpc_method_handler( 978 servicer.ApprovePairing, 979 request_deserializer=glclient_dot_scheduler__pb2.ApprovePairingRequest.FromString, 980 response_serializer=glclient_dot_greenlight__pb2.Empty.SerializeToString, 981 ), 982 } 983 generic_handler = grpc.method_handlers_generic_handler( 984 'scheduler.Pairing', rpc_method_handlers) 985 server.add_generic_rpc_handlers((generic_handler,)) 986 server.add_registered_method_handlers('scheduler.Pairing', rpc_method_handlers)
990class Pairing(object): 991 """A service to pair signer-less clients with an existing signer. 992 """ 993 994 @staticmethod 995 def PairDevice(request, 996 target, 997 options=(), 998 channel_credentials=None, 999 call_credentials=None, 1000 insecure=False, 1001 compression=None, 1002 wait_for_ready=None, 1003 timeout=None, 1004 metadata=None): 1005 return grpc.experimental.unary_unary( 1006 request, 1007 target, 1008 '/scheduler.Pairing/PairDevice', 1009 glclient_dot_scheduler__pb2.PairDeviceRequest.SerializeToString, 1010 glclient_dot_scheduler__pb2.PairDeviceResponse.FromString, 1011 options, 1012 channel_credentials, 1013 insecure, 1014 call_credentials, 1015 compression, 1016 wait_for_ready, 1017 timeout, 1018 metadata, 1019 _registered_method=True) 1020 1021 @staticmethod 1022 def GetPairingData(request, 1023 target, 1024 options=(), 1025 channel_credentials=None, 1026 call_credentials=None, 1027 insecure=False, 1028 compression=None, 1029 wait_for_ready=None, 1030 timeout=None, 1031 metadata=None): 1032 return grpc.experimental.unary_unary( 1033 request, 1034 target, 1035 '/scheduler.Pairing/GetPairingData', 1036 glclient_dot_scheduler__pb2.GetPairingDataRequest.SerializeToString, 1037 glclient_dot_scheduler__pb2.GetPairingDataResponse.FromString, 1038 options, 1039 channel_credentials, 1040 insecure, 1041 call_credentials, 1042 compression, 1043 wait_for_ready, 1044 timeout, 1045 metadata, 1046 _registered_method=True) 1047 1048 @staticmethod 1049 def ApprovePairing(request, 1050 target, 1051 options=(), 1052 channel_credentials=None, 1053 call_credentials=None, 1054 insecure=False, 1055 compression=None, 1056 wait_for_ready=None, 1057 timeout=None, 1058 metadata=None): 1059 return grpc.experimental.unary_unary( 1060 request, 1061 target, 1062 '/scheduler.Pairing/ApprovePairing', 1063 glclient_dot_scheduler__pb2.ApprovePairingRequest.SerializeToString, 1064 glclient_dot_greenlight__pb2.Empty.FromString, 1065 options, 1066 channel_credentials, 1067 insecure, 1068 call_credentials, 1069 compression, 1070 wait_for_ready, 1071 timeout, 1072 metadata, 1073 _registered_method=True)
A service to pair signer-less clients with an existing signer.
994 @staticmethod 995 def PairDevice(request, 996 target, 997 options=(), 998 channel_credentials=None, 999 call_credentials=None, 1000 insecure=False, 1001 compression=None, 1002 wait_for_ready=None, 1003 timeout=None, 1004 metadata=None): 1005 return grpc.experimental.unary_unary( 1006 request, 1007 target, 1008 '/scheduler.Pairing/PairDevice', 1009 glclient_dot_scheduler__pb2.PairDeviceRequest.SerializeToString, 1010 glclient_dot_scheduler__pb2.PairDeviceResponse.FromString, 1011 options, 1012 channel_credentials, 1013 insecure, 1014 call_credentials, 1015 compression, 1016 wait_for_ready, 1017 timeout, 1018 metadata, 1019 _registered_method=True)
1021 @staticmethod 1022 def GetPairingData(request, 1023 target, 1024 options=(), 1025 channel_credentials=None, 1026 call_credentials=None, 1027 insecure=False, 1028 compression=None, 1029 wait_for_ready=None, 1030 timeout=None, 1031 metadata=None): 1032 return grpc.experimental.unary_unary( 1033 request, 1034 target, 1035 '/scheduler.Pairing/GetPairingData', 1036 glclient_dot_scheduler__pb2.GetPairingDataRequest.SerializeToString, 1037 glclient_dot_scheduler__pb2.GetPairingDataResponse.FromString, 1038 options, 1039 channel_credentials, 1040 insecure, 1041 call_credentials, 1042 compression, 1043 wait_for_ready, 1044 timeout, 1045 metadata, 1046 _registered_method=True)
1048 @staticmethod 1049 def ApprovePairing(request, 1050 target, 1051 options=(), 1052 channel_credentials=None, 1053 call_credentials=None, 1054 insecure=False, 1055 compression=None, 1056 wait_for_ready=None, 1057 timeout=None, 1058 metadata=None): 1059 return grpc.experimental.unary_unary( 1060 request, 1061 target, 1062 '/scheduler.Pairing/ApprovePairing', 1063 glclient_dot_scheduler__pb2.ApprovePairingRequest.SerializeToString, 1064 glclient_dot_greenlight__pb2.Empty.FromString, 1065 options, 1066 channel_credentials, 1067 insecure, 1068 call_credentials, 1069 compression, 1070 wait_for_ready, 1071 timeout, 1072 metadata, 1073 _registered_method=True)