Look up per-customer sgx

Stephen Paul Weber created

Change summary

config-schema.dhall                |  5 +++++
config.dhall.sample                |  3 +++
lib/admin_actions/number_change.rb |  2 +-
lib/bwmsgsv2_repo.rb               |  4 ++--
lib/customer_repo.rb               |  2 +-
lib/trivial_backend_sgx_repo.rb    | 14 ++++++++++----
test/test_admin_command.rb         |  8 ++++++++
test/test_backend_sgx.rb           |  2 +-
test/test_customer_info.rb         | 29 +++++++++++++++++++++++++++++
test/test_customer_repo.rb         | 12 +++++++++++-
test/test_registration.rb          | 20 ++++++++++++++++++++
11 files changed, 91 insertions(+), 10 deletions(-)

Detailed changes

config-schema.dhall 🔗

@@ -63,6 +63,11 @@
 , rev_ai_token : Text
 , server : { host : Text, port : Natural }
 , sgx : Text
+, sgx_creds :
+    List
+      { mapKey : Text
+      , mapValue : { account : Text, password : Text, username : Text }
+      }
 , simpleswap_api_key : Text
 , sims :
     { esim :

config.dhall.sample 🔗

@@ -14,6 +14,9 @@ in
 	web_root = "https://example.com",
 	ogm_path = "/var/www/media.example.com",
 	ogm_web_root = "https://media.example.com",
+	sgx_creds = [
+		{ mapKey = "component-other.localhost", mapValue = { account = "", username = "", password = "" } }
+	],
 	creds = {
 		account = "00000",
 		username = "dashboard user",

lib/admin_actions/number_change.rb 🔗

@@ -68,7 +68,7 @@ class AdminAction
 		end
 
 		def forward
-			TrivialBackendSgxRepo.new.get(customer_id).then do |sgx|
+			TrivialBackendSgxRepo.new(redis: REDIS).get(customer_id).then do |sgx|
 				EMPromise.all([
 					REDIS.rename("catapult_fwd-#{old_tel}", "catapult_fwd-#{new_tel}"),
 					sgx.register!(new_tel),

lib/bwmsgsv2_repo.rb 🔗

@@ -18,7 +18,7 @@ class Bwmsgsv2Repo
 		@jid = jid
 		@redis = redis
 		@ibr_repo = ibr_repo
-		@trivial_repo = TrivialBackendSgxRepo.new(jid: jid, **kwargs)
+		@trivial_repo = TrivialBackendSgxRepo.new(jid: jid, redis: redis, **kwargs)
 	end
 
 	def get(customer_id, tel: nil)
@@ -75,7 +75,7 @@ protected
 	def registration(sgx)
 		EMPromise.resolve(sgx.registered?)
 	rescue NotLoaded::NotLoadedError
-		@ibr_repo.registered?(@jid, from: sgx.from_jid)
+		@ibr_repo.registered?(sgx.jid, from: sgx.from_jid)
 	end
 
 	def from_redis(from_jid, tel)

lib/customer_repo.rb 🔗

@@ -157,7 +157,7 @@ class CustomerRepo
 protected
 
 	def mksgx(cid)
-		TrivialBackendSgxRepo.new.get(cid).then { |s| s.with(registered?: false) }
+		TrivialBackendSgxRepo.get_unregistered(cid, redis: redis)
 	end
 
 	def mget(*keys)

lib/trivial_backend_sgx_repo.rb 🔗

@@ -8,21 +8,27 @@ class TrivialBackendSgxRepo
 		jid: CONFIG[:sgx],
 		creds: CONFIG[:creds],
 		component_jid: CONFIG[:component][:jid],
+		redis: LazyObject.new { REDIS },
 		**with
 	)
 		@jid = Blather::JID.new(jid)
 		@creds = creds
 		@component_jid = component_jid
+		@redis = redis
 		@with = with
 	end
 
+	def self.get_unregistered(customer_id, **kwargs)
+		new(**kwargs).get(customer_id).then { |s| s.with(registered?: false) }
+	end
+
 	def get(customer_id, tel: nil)
-		EMPromise.resolve(nil).then do
+		@redis.get("jmp_customer_backend_sgx-#{customer_id}").then do |sgx_jid|
+			creds = sgx_jid ? CONFIG[:sgx_creds][sgx_jid] : @creds
 			BackendSgx.new(
-				jid: @jid, creds: @creds,
+				jid: sgx_jid ? Blather::JID.new(sgx_jid) : @jid, creds: creds,
 				from_jid: Blather::JID.new("customer_#{customer_id}", @component_jid),
-				ogm_url: NotLoaded.new(:ogm_url),
-				fwd: NotLoaded.new(:fwd_timeout),
+				ogm_url: NotLoaded.new(:ogm_url), fwd: NotLoaded.new(:fwd_timeout),
 				transcription_enabled: NotLoaded.new(:transcription_enabled),
 				registered?: tel ? ibr_for(tel) : NotLoaded.new(:registered?)
 			).with(@with)

test/test_admin_command.rb 🔗

@@ -7,6 +7,7 @@ BackendSgx::IQ_MANAGER = Minitest::Mock.new
 AdminAction::LaunchSnikket::IQ_MANAGER = Minitest::Mock.new
 Customer::BLATHER = Minitest::Mock.new
 AdminActionRepo::REDIS = Minitest::Mock.new
+TrivialBackendSgxRepo::REDIS = Minitest::Mock.new
 
 class AdminCommandTest < Minitest::Test
 	def admin_command(tel="+15556667777")
@@ -58,6 +59,12 @@ class AdminCommandTest < Minitest::Test
 				[ProxiedJID]
 			)
 
+			TrivialBackendSgxRepo::REDIS.expect(
+				:get,
+				EMPromise.resolve(nil),
+				["jmp_customer_backend_sgx-testuser"]
+			)
+
 			TrustLevelRepo::REDIS.expect(
 				:get,
 				EMPromise.resolve("Customer"),
@@ -93,6 +100,7 @@ class AdminCommandTest < Minitest::Test
 		assert_mock Command::COMMAND_MANAGER
 		assert_mock TrustLevelRepo::REDIS
 		assert_mock Subaccount::DB
+		assert_mock TrivialBackendSgxRepo::REDIS
 	end
 	em :test_no_user
 

test/test_backend_sgx.rb 🔗

@@ -53,7 +53,7 @@ class BackendSgxTest < Minitest::Test
 				assert_equal "+15555550000", ibr.phone
 			end]
 		)
-		sgx = TrivialBackendSgxRepo.new.get("test").sync
+		sgx = TrivialBackendSgxRepo.new(redis: FakeRedis.new).get("test").sync
 		sgx.register!("+15555550000")
 		BackendSgx::IQ_MANAGER.verify
 	end

test/test_customer_info.rb 🔗

@@ -17,6 +17,7 @@ PlanInfo::DB = FakeDB.new(
 	]
 )
 Subaccount::DB = Minitest::Mock.new
+TrivialBackendSgxRepo::REDIS = Minitest::Mock.new
 
 class CustomerInfoTest < Minitest::Test
 	def test_info_does_not_crash
@@ -124,6 +125,12 @@ class CustomerInfoTest < Minitest::Test
 			[String, ["test"]]
 		)
 
+		TrivialBackendSgxRepo::REDIS.expect(
+			:get,
+			EMPromise.resolve(nil),
+			["jmp_customer_backend_sgx-test"]
+		)
+
 		cust = customer(sgx: sgx, plan_name: "test_usd")
 
 		trust_repo = Minitest::Mock.new
@@ -134,6 +141,7 @@ class CustomerInfoTest < Minitest::Test
 		assert_mock trust_repo
 		assert_mock CustomerUsage::DB
 		assert_mock Subaccount::DB
+		assert_mock TrivialBackendSgxRepo::REDIS
 	end
 	em :test_admin_info_does_not_crash
 
@@ -160,6 +168,12 @@ class CustomerInfoTest < Minitest::Test
 			[String, ["test"]]
 		)
 
+		TrivialBackendSgxRepo::REDIS.expect(
+			:get,
+			EMPromise.resolve(nil),
+			["jmp_customer_backend_sgx-test"]
+		)
+
 		cust = customer(sgx: sgx, plan_name: "test_usd")
 
 		call_attempt_repo = Minitest::Mock.new
@@ -181,6 +195,7 @@ class CustomerInfoTest < Minitest::Test
 		assert_mock trust_repo
 		assert_mock CustomerUsage::DB
 		assert_mock Subaccount::DB
+		assert_mock TrivialBackendSgxRepo::REDIS
 	end
 	em :test_admin_info_with_tel_does_not_crash
 
@@ -212,6 +227,12 @@ class CustomerInfoTest < Minitest::Test
 			[String, ["test"]]
 		)
 
+		TrivialBackendSgxRepo::REDIS.expect(
+			:get,
+			EMPromise.resolve(nil),
+			["jmp_customer_backend_sgx-test"]
+		)
+
 		plan = CustomerPlan.new("test", plan: nil, expires_at: nil)
 		cust = Customer.new(
 			"test",
@@ -227,6 +248,7 @@ class CustomerInfoTest < Minitest::Test
 		assert_mock sgx
 		assert_mock trust_repo
 		assert_mock Subaccount::DB
+		assert_mock TrivialBackendSgxRepo::REDIS
 	end
 	em :test_inactive_admin_info_does_not_crash
 
@@ -255,6 +277,12 @@ class CustomerInfoTest < Minitest::Test
 			[String, ["parent"]]
 		)
 
+		TrivialBackendSgxRepo::REDIS.expect(
+			:get,
+			EMPromise.resolve(nil),
+			["jmp_customer_backend_sgx-test"]
+		)
+
 		cust = customer(
 			sgx: sgx,
 			plan_name: "test_usd",
@@ -269,6 +297,7 @@ class CustomerInfoTest < Minitest::Test
 		assert_mock trust_repo
 		assert_mock CustomerUsage::DB
 		assert_mock Subaccount::DB
+		assert_mock TrivialBackendSgxRepo::REDIS
 	end
 	em :test_admin_info_subaccount_does_not_crash
 end

test/test_customer_repo.rb 🔗

@@ -58,7 +58,7 @@ class CustomerRepoTest < Minitest::Test
 		db: FAKE_DB,
 		braintree: Minitest::Mock.new
 	)
-		sgx_repo = Minitest::Mock.new(TrivialBackendSgxRepo.new)
+		sgx_repo = Minitest::Mock.new(TrivialBackendSgxRepo.new(redis: FAKE_REDIS))
 		CustomerRepo.new(
 			redis: redis,
 			db: db,
@@ -149,6 +149,11 @@ class CustomerRepoTest < Minitest::Test
 				"jmp_customer_jid-test", "test@example.com"
 			]
 		)
+		redis.expect(
+			:get,
+			EMPromise.resolve(nil),
+			["jmp_customer_backend_sgx-test"]
+		)
 		assert_kind_of Customer, repo.create("test@example.com").sync
 		assert_mock braintree
 		assert_mock braintree_customer
@@ -176,6 +181,11 @@ class CustomerRepoTest < Minitest::Test
 				"jmp_customer_jid-testp", "test@parented.example.com"
 			]
 		)
+		redis.expect(
+			:get,
+			EMPromise.resolve(nil),
+			["jmp_customer_backend_sgx-testp"]
+		)
 		redis.expect(
 			:get,
 			EMPromise.resolve("test@parented.example.com"),

test/test_registration.rb 🔗

@@ -1233,6 +1233,11 @@ class RegistrationTest < Minitest::Test
 				nil,
 				["jmp_group_codes", nil]
 			)
+			Bwmsgsv2Repo::REDIS.expect(
+				:get,
+				EMPromise.resolve(nil),
+				["jmp_customer_backend_sgx-test"]
+			)
 			Bwmsgsv2Repo::REDIS.expect(
 				:set,
 				nil,
@@ -1351,6 +1356,11 @@ class RegistrationTest < Minitest::Test
 					assert_equal "Referral Bonus", params[5]
 				}]
 			)
+			Bwmsgsv2Repo::REDIS.expect(
+				:get,
+				EMPromise.resolve(nil),
+				["jmp_customer_backend_sgx-test"]
+			)
 			Bwmsgsv2Repo::REDIS.expect(
 				:set,
 				nil,
@@ -1451,6 +1461,11 @@ class RegistrationTest < Minitest::Test
 				nil,
 				["jmp_group_codes", nil]
 			)
+			Bwmsgsv2Repo::REDIS.expect(
+				:get,
+				EMPromise.resolve(nil),
+				["jmp_customer_backend_sgx-test"]
+			)
 			Bwmsgsv2Repo::REDIS.expect(
 				:set,
 				nil,
@@ -1535,6 +1550,11 @@ class RegistrationTest < Minitest::Test
 				EMPromise.resolve(OpenStruct.new(cmd_tuples: 1)),
 				[String, ["+15555550000"]]
 			)
+			Bwmsgsv2Repo::REDIS.expect(
+				:get,
+				EMPromise.resolve(nil),
+				["jmp_customer_backend_sgx-test"]
+			)
 			Bwmsgsv2Repo::REDIS.expect(
 				:set,
 				nil,