@@ -314,6 +314,78 @@ impl DataStore {
314314 } )
315315 }
316316
317+ pub async fn bgp_update_announce_set (
318+ & self ,
319+ opctx : & OpContext ,
320+ announce : & params:: BgpAnnounceSetCreate ,
321+ ) -> CreateResult < ( BgpAnnounceSet , Vec < BgpAnnouncement > ) > {
322+ use db:: schema:: bgp_announce_set:: dsl as announce_set_dsl;
323+ use db:: schema:: bgp_announcement:: dsl as bgp_announcement_dsl;
324+
325+ let conn = self . pool_connection_authorized ( opctx) . await ?;
326+
327+ self . transaction_retry_wrapper ( "bgp_update_announce_set" )
328+ . transaction ( & conn, |conn| async move {
329+ let bas: BgpAnnounceSet = announce. clone ( ) . into ( ) ;
330+
331+ // ensure the announce set exists
332+ let found_as: Option < BgpAnnounceSet > =
333+ announce_set_dsl:: bgp_announce_set
334+ . filter (
335+ announce_set_dsl:: name
336+ . eq ( Name :: from ( bas. name ( ) . clone ( ) ) ) ,
337+ )
338+ . filter ( announce_set_dsl:: time_deleted. is_null ( ) )
339+ . select ( BgpAnnounceSet :: as_select ( ) )
340+ . limit ( 1 )
341+ . first_async ( & conn)
342+ . await
343+ . ok ( ) ;
344+
345+ let db_as = match found_as {
346+ Some ( v) => v,
347+ None => {
348+ diesel:: insert_into ( announce_set_dsl:: bgp_announce_set)
349+ . values ( bas. clone ( ) )
350+ . returning ( BgpAnnounceSet :: as_returning ( ) )
351+ . get_result_async :: < BgpAnnounceSet > ( & conn)
352+ . await ?
353+ }
354+ } ;
355+
356+ // clear existing announcements
357+ diesel:: delete ( bgp_announcement_dsl:: bgp_announcement)
358+ . filter (
359+ bgp_announcement_dsl:: announce_set_id. eq ( db_as. id ( ) ) ,
360+ )
361+ . execute_async ( & conn)
362+ . await ?;
363+
364+ // repopulate announcements
365+ let mut db_annoucements = Vec :: new ( ) ;
366+ for a in & announce. announcement {
367+ let an = BgpAnnouncement {
368+ announce_set_id : db_as. id ( ) ,
369+ address_lot_block_id : bas. identity . id ,
370+ network : a. network . into ( ) ,
371+ } ;
372+ let db_an = diesel:: insert_into (
373+ bgp_announcement_dsl:: bgp_announcement,
374+ )
375+ . values ( an. clone ( ) )
376+ . returning ( BgpAnnouncement :: as_returning ( ) )
377+ . get_result_async :: < BgpAnnouncement > ( & conn)
378+ . await ?;
379+
380+ db_annoucements. push ( db_an) ;
381+ }
382+
383+ Ok ( ( db_as, db_annoucements) )
384+ } )
385+ . await
386+ . map_err ( |e| public_error_from_diesel ( e, ErrorHandler :: Server ) )
387+ }
388+
317389 pub async fn bgp_create_announce_set (
318390 & self ,
319391 opctx : & OpContext ,
0 commit comments