Skip to content

Commit 9ee416f

Browse files
committed
ensure (not exclusively create) silo groups
so multiple logins do not cause one another to fail
1 parent a2507a6 commit 9ee416f

File tree

4 files changed

+23
-13
lines changed

4 files changed

+23
-13
lines changed

common/src/sql/dbinit.sql

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -296,8 +296,7 @@ CREATE INDEX ON omicron.public.silo_group (
296296
CREATE UNIQUE INDEX ON omicron.public.silo_group (
297297
silo_id,
298298
external_id
299-
) WHERE
300-
time_deleted IS NULL;
299+
);
301300

302301
/*
303302
* Silo group membership

nexus/src/app/silo.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ impl super::Nexus {
252252

253253
None => {
254254
self.db_datastore
255-
.silo_group_create(
255+
.silo_group_ensure(
256256
opctx,
257257
authz_silo,
258258
db::model::SiloGroup::new(

nexus/src/db/datastore/silo.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -85,11 +85,11 @@ impl DataStore {
8585
let authz_silo =
8686
authz::Silo::new(authz::FLEET, silo_id, LookupType::ById(silo_id));
8787

88-
let silo_admin_group_create_query = if let Some(ref admin_group_name) =
88+
let silo_admin_group_ensure_query = if let Some(ref admin_group_name) =
8989
new_silo_params.admin_group_name
9090
{
91-
let silo_admin_group_create_query =
92-
DataStore::silo_group_create_query(
91+
let silo_admin_group_ensure_query =
92+
DataStore::silo_group_ensure_query(
9393
opctx,
9494
&authz_silo,
9595
db::model::SiloGroup::new(
@@ -100,7 +100,7 @@ impl DataStore {
100100
)
101101
.await?;
102102

103-
Some(silo_admin_group_create_query)
103+
Some(silo_admin_group_ensure_query)
104104
} else {
105105
None
106106
};
@@ -134,7 +134,7 @@ impl DataStore {
134134
.transaction(move |conn| {
135135
let silo = silo_create_query.get_result(conn)?;
136136

137-
if let Some(query) = silo_admin_group_create_query {
137+
if let Some(query) = silo_admin_group_ensure_query {
138138
query.get_result(conn)?;
139139
}
140140

nexus/src/db/datastore/silo_group.rs

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ use omicron_common::api::external::UpdateResult;
2828
use uuid::Uuid;
2929

3030
impl DataStore {
31-
pub async fn silo_group_create_query(
31+
pub(super) async fn silo_group_ensure_query(
3232
opctx: &OpContext,
3333
authz_silo: &authz::Silo,
3434
silo_group: SiloGroup,
@@ -38,20 +38,31 @@ impl DataStore {
3838
use db::schema::silo_group::dsl;
3939
Ok(diesel::insert_into(dsl::silo_group)
4040
.values(silo_group)
41+
.on_conflict((dsl::silo_id, dsl::external_id))
42+
.do_nothing()
4143
.returning(SiloGroup::as_returning()))
4244
}
4345

44-
pub async fn silo_group_create(
46+
pub async fn silo_group_ensure(
4547
&self,
4648
opctx: &OpContext,
4749
authz_silo: &authz::Silo,
4850
silo_group: SiloGroup,
4951
) -> CreateResult<SiloGroup> {
50-
DataStore::silo_group_create_query(opctx, authz_silo, silo_group)
52+
let external_id = silo_group.external_id.clone();
53+
54+
DataStore::silo_group_ensure_query(opctx, authz_silo, silo_group)
5155
.await?
52-
.get_result_async(self.pool_authorized(opctx).await?)
56+
.execute_async(self.pool_authorized(opctx).await?)
5357
.await
54-
.map_err(|e| public_error_from_diesel_pool(e, ErrorHandler::Server))
58+
.map_err(|e| {
59+
public_error_from_diesel_pool(e, ErrorHandler::Server)
60+
})?;
61+
62+
Ok(self
63+
.silo_group_optional_lookup(opctx, authz_silo, external_id)
64+
.await?
65+
.unwrap())
5566
}
5667

5768
pub async fn silo_group_optional_lookup(

0 commit comments

Comments
 (0)