/* Ċ Ġ* ĠTencent Ġis Ġplease d Ġto Ġsupport Ġthe Ġopen Ġsource Ġcommunity Ġby Ġmaking ĠB K - CI Ġ èĵĿ é² ¸ æĮģ ç»Ń éĽĨ æĪĲ å¹³åı° Ġavailable . ĠĠĊ Ġ* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 9 ĠTH L ĠA 2 9 ĠLimited , Ġa ĠTencent Ġcompany . Ġ ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠB K - CI Ġ èĵĿ é² ¸ æĮģ ç»Ń éĽĨ æĪĲ å¹³åı° Ġis Ġlicensed Ġunder Ġthe ĠMIT Ġlicense . Ċ Ġ* Ċ Ġ* ĠA Ġcopy Ġof Ġthe ĠMIT ĠLicense Ġis Ġincluded Ġin Ġthis Ġfile . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠTerms Ġof Ġthe ĠMIT ĠLicense : Ċ Ġ* Ġ------------------------------------------------ --- Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE ĠSOFTWARE . Ċ Ġ* Ċ Ġ* Ċ Ġ*/ Ċ Ċ package Ġcom . tencent . bk repo . repository . service Ċ Ċ import Ġcom . tencent . bk repo . common . api . exception . ErrorCode Exception Ċ import Ġcom . tencent . bk repo . common . artifact . pojo . Repository Category Ċ import Ġcom . tencent . bk repo . common . artifact . pojo . Repository Type Ċ import Ġcom . tencent . bk repo . common . artifact . pojo . configuration . local . Local Configuration Ċ import Ġcom . tencent . bk repo . common . storage . credentials . FileSystem Credentials Ċ import Ġcom . tencent . bk repo . repository . UT _ PROJECT _ ID Ċ import Ġcom . tencent . bk repo . repository . UT _ REPO _ DISPLAY Ċ import Ġcom . tencent . bk repo . repository . UT _ REPO _ NAME Ċ import Ġcom . tencent . bk repo . repository . UT _ STORAGE _ CRED ENTIAL S _ KEY Ċ import Ġcom . tencent . bk repo . repository . UT _ USER Ċ import Ġcom . tencent . bk repo . repository . config . Repository Properties Ċ import Ġcom . tencent . bk repo . repository . constant . SYSTEM _ USER Ċ import Ġcom . tencent . bk repo . repository . pojo . cred end ial . Storage Credentials CreateRequest Ċ import Ġcom . tencent . bk repo . repository . pojo . project . Project CreateRequest Ċ import Ġcom . tencent . bk repo . repository . pojo . repo . Repo CreateRequest Ċ import Ġcom . tencent . bk repo . repository . pojo . repo . Repo Delete Request Ċ import Ġcom . tencent . bk repo . repository . pojo . repo . Repo Update Request Ċ import Ġorg . junit . jupiter . api . Assertions . assertEquals Ċ import Ġorg . junit . jupiter . api . Assertions . assertFalse Ċ import Ġorg . junit . jupiter . api . Assertions . assertNotNull Ċ import Ġorg . junit . jupiter . api . Assertions . assertNull Ċ import Ġorg . junit . jupiter . api . Assertions . assertTrue Ċ import Ġorg . junit . jupiter . api . Before All Ċ import Ġorg . junit . jupiter . api . BeforeEach Ċ import Ġorg . junit . jupiter . api . DisplayName Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . junit . jupiter . api . Test Instance Ċ import Ġorg . junit . jupiter . api . assert Throws Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . boot . test . autoconfigure . data . mongo . Data Mongo Test Ċ import Ġorg . springframework . boot . test . mock . mockito . Mock Bean Ċ Ċ @ DisplayName (" ä»ĵåºĵ æľįåĬ¡ æµĭè¯ķ ") Ċ @ Data Mongo Test Ċ @ Test Instance ( Test Instance . Lifecycle . PER _ CLASS ) Ċ class ĠRepository Service Test Ġ@ Autowired Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġproject Service : ĠProject Service , ĊĠĠĠ Ġprivate Ġval Ġrepository Service : ĠRepository Service , ĊĠĠĠ Ġprivate Ġval Ġstorage Credential Service : ĠStorage Credential Service , ĊĠĠĠ Ġprivate Ġval Ġrepository Properties : ĠRepository Properties Ċ ) Ġ: ĠService Base Test () Ġ{ ĊĊĠĠĠ Ġ@ Mock Bean ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġnode Service : ĠNode Service ĊĊĠĠĠ Ġprivate Ġval Ġstorage Credentials Ġ= ĠFileSystem Credentials (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġpath Ġ= Ġ" test " ĊĠĠĠĠĠĠĠ Ġcache . enabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġcache . path Ġ= Ġ" cache - test " ĊĠĠĠĠĠĠĠ Ġcache . expire Days Ġ= Ġ 1 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Before All ĊĠĠĠ Ġfun Ġbefore All () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Mock () ĊĠĠĠĠĠĠĠ Ġif Ġ(! project Service . exist ( UT _ PROJECT _ ID )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproject CreateRequest Ġ= ĠProject CreateRequest ( UT _ PROJECT _ ID , ĠUT _ REPO _ NAME , ĠUT _ REPO _ DISPLAY , ĠUT _ USER ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Service . create ( project CreateRequest ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġstorage CreateRequest Ġ= ĠStorage Credentials CreateRequest ( UT _ STORAGE _ CRED ENTIAL S _ KEY , Ġstorage Credentials ) ĊĠĠĠĠĠĠĠ Ġstorage Credential Service . create ( UT _ USER , Ġstorage CreateRequest ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ BeforeEach ĊĠĠĠ Ġfun ĠbeforeEach () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Mock () ĊĠĠĠĠĠĠĠ Ġrepository Service . list ( UT _ PROJECT _ ID ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository Service . delete ( Repo Delete Request ( UT _ PROJECT _ ID , Ġit . name , ĠUT _ USER )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ DisplayName (" æµĭè¯ķ åĪĹè¡¨ æŁ¥è¯¢ ") ĊĠĠĠ Ġfun Ġ` test Ġlist Ġquery `() Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġrepository Service . list ( UT _ PROJECT _ ID ). size ) ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġ 2 0 ĊĠĠĠĠĠĠĠ Ġrepeat ( size ) Ġ{ Ġrepository Service . create ( create Request (" repo $ it ")) Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( size , Ġrepository Service . list ( UT _ PROJECT _ ID ). size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ DisplayName (" æµĭè¯ķ åĪĨé¡µ æŁ¥è¯¢ ") ĊĠĠĠ Ġfun Ġ` test Ġpage Ġquery `() Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġrepository Service . list ( UT _ PROJECT _ ID ). size ) ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġ 5 1 L ĊĠĠĠĠĠĠĠ Ġrepeat ( size . toInt ()) Ġ{ Ġrepository Service . create ( create Request (" repo $ it ")) Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġpage Ġ= Ġrepository Service . page ( UT _ PROJECT _ ID , Ġ 0 , Ġ 1 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 0 , Ġpage . records . size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( size , Ġpage . count ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġpage . page ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 0 , Ġpage . pageSize ) ĊĊĠĠĠĠĠĠĠ Ġpage Ġ= Ġrepository Service . page ( UT _ PROJECT _ ID , Ġ 5 , Ġ 1 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġpage . records . size ) ĊĠĠĠĠĠĠĠ Ġpage Ġ= Ġrepository Service . page ( UT _ PROJECT _ ID , Ġ 6 , Ġ 1 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġpage . records . size ) ĊĊĠĠĠĠĠĠĠ Ġpage Ġ= Ġrepository Service . page ( UT _ PROJECT _ ID , Ġ 0 , Ġ 2 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 0 , Ġpage . records . size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( size , Ġpage . count ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġpage . page ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 0 , Ġpage . pageSize ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ DisplayName (" æµĭè¯ķ åĪ¤æĸŃ ä»ĵåºĵ æĺ¯åĲ¦ åŃĺåľ¨ ") ĊĠĠĠ Ġfun Ġ` test Ġcheck Ġexist `() Ġ{ ĊĠĠĠĠĠĠĠ Ġrepository Service . create ( create Request ()) ĊĠĠĠĠĠĠĠ ĠassertTrue ( repository Service . exist ( UT _ PROJECT _ ID , ĠUT _ REPO _ NAME )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( repository Service . exist ( UT _ PROJECT _ ID , ĠUT _ REPO _ NAME , ĠRepository Type . GENERIC . name )) ĊĠĠĠĠĠĠĠ ĠassertFalse ( repository Service . exist ("", Ġ"")) ĊĠĠĠĠĠĠĠ ĠassertFalse ( repository Service . exist ( UT _ PROJECT _ ID , Ġ"")) ĊĠĠĠĠĠĠĠ ĠassertFalse ( repository Service . exist ("", ĠUT _ REPO _ NAME )) ĊĊĠĠĠĠĠĠĠ Ġrepository Service . delete ( Repo Delete Request ( UT _ PROJECT _ ID , ĠUT _ REPO _ NAME , ĠSYSTEM _ USER )) ĊĠĠĠĠĠĠĠ ĠassertFalse ( repository Service . exist ( UT _ PROJECT _ ID , ĠUT _ REPO _ NAME )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ DisplayName (" æµĭè¯ķ åĪĽå»º åĲĮ åĲį ä»ĵåºĵ ") ĊĠĠĠ Ġfun Ġ` should Ġthrow Ġexception Ġwhen Ġrepo Ġname Ġexists `() Ġ{ ĊĠĠĠĠĠĠĠ Ġrepository Service . create ( create Request ()) ĊĠĠĠĠĠĠĠ ĠassertThrows < ErrorCode Exception > Ġ{ Ġrepository Service . create ( create Request ()) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ DisplayName (" æµĭè¯ķ ä½¿çĶ¨ æĮĩå®ļ storage Ġkey åĪĽå»º ä»ĵåºĵ ") ĊĠĠĠ Ġfun Ġ` test Ġcreate Ġwith Ġspecific Ġstorage Ġkey `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġcreate Request ( storage Credentials Key Ġ= ĠUT _ STORAGE _ CRED ENTIAL S _ KEY ) ĊĠĠĠĠĠĠĠ Ġrepository Service . create ( request ) ĊĠĠĠĠĠĠĠ Ġval Ġrepository Ġ= Ġrepository Service . detail ( UT _ PROJECT _ ID , ĠUT _ REPO _ NAME , ĠRepository Type . GENERIC . name ) !! ĊĠĠĠĠĠĠĠ ĠassertEquals ( UT _ REPO _ NAME , Ġrepository . name ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Repository Type . GENERIC , Ġrepository . type ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Repository Category . LOCAL , Ġrepository . category ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( true , Ġrepository . public ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( UT _ PROJECT _ ID , Ġrepository . projectId ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" simple Ġdescription ", Ġrepository . description ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( storage Credentials , Ġrepository . storage Credentials ) ĊĊĠĠĠĠĠĠĠ ĠassertThrows < ErrorCode Exception > Ġ{ Ġrepository Service . create ( create Request ()) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ DisplayName (" æµĭè¯ķ ä½¿çĶ¨ ç©º storage Ġkey åĪĽå»º ä»ĵåºĵ ") ĊĠĠĠ Ġfun Ġ` test Ġcreate Ġwith Ġnull Ġstorage Ġkey `() Ġ{ ĊĠĠĠĠĠĠĠ ĠassertNull ( repository Properties . default Storage Credentials Key ) ĊĠĠĠĠĠĠĠ Ġrepository Service . create ( create Request ()) ĊĠĠĠĠĠĠĠ Ġval Ġrepository Ġ= Ġrepository Service . detail ( UT _ PROJECT _ ID , ĠUT _ REPO _ NAME , ĠRepository Type . GENERIC . name ) !! ĊĠĠĠĠĠĠĠ ĠassertNull ( repository . storage Credentials ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ DisplayName (" æµĭè¯ķ ä½¿çĶ¨ é»ĺè®¤ storage Ġkey åĪĽå»º ä»ĵåºĵ ") ĊĠĠĠ Ġfun Ġ` test Ġcreate Ġwith Ġdefault Ġstorage Ġkey `() Ġ{ ĊĠĠĠĠĠĠĠ Ġrepository Properties . default Storage Credentials Key Ġ= ĠUT _ STORAGE _ CRED ENTIAL S _ KEY ĊĠĠĠĠĠĠĠ Ġrepository Service . create ( create Request ()) ĊĠĠĠĠĠĠĠ Ġval Ġrepository Ġ= Ġrepository Service . detail ( UT _ PROJECT _ ID , ĠUT _ REPO _ NAME , ĠRepository Type . GENERIC . name ) !! ĊĊĠĠĠĠĠĠĠ Ġval Ġdb Credential Ġ= Ġrepository . storage Credentials ĊĠĠĠĠĠĠĠ ĠassertEquals ( storage Credentials , Ġdb Credential ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ DisplayName (" æµĭè¯ķ ä½¿çĶ¨ ä¸įåŃĺåľ¨ çļĦ storage Ġkey åĪĽå»º ä»ĵåºĵ ") ĊĠĠĠ Ġfun Ġ` should Ġthrow Ġexception Ġwhen Ġstorage Ġkey Ġnon existent `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġcreate Request ( storage Credentials Key Ġ= Ġ" non - exist - credentials - key ") ĊĠĠĠĠĠĠĠ ĠassertThrows < ErrorCode Exception > Ġ{ Ġrepository Service . create ( request ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ DisplayName (" æµĭè¯ķ æĽ´æĸ° ä»ĵåºĵ ä¿¡æģ¯ ") ĊĠĠĠ Ġfun Ġ` test Ġupdate Ġrepository Ġinfo `() Ġ{ ĊĠĠĠĠĠĠĠ Ġrepository Service . create ( create Request ()) ĊĠĠĠĠĠĠĠ Ġrepository Service . update ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRepo Update Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= ĠUT _ PROJECT _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠUT _ REPO _ NAME , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" updated Ġdescription ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoperator Ġ= ĠUT _ USER ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġrepository Ġ= Ġrepository Service . detail ( UT _ PROJECT _ ID , ĠUT _ REPO _ NAME ) !! ĊĠĠĠĠĠĠĠ ĠassertEquals ( false , Ġrepository . public ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" updated Ġdescription ", Ġrepository . description ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ DisplayName (" æµĭè¯ķ åĪłéĻ¤ ä»ĵåºĵ ") ĊĠĠĠ Ġfun Ġ` test Ġdelete Ġrepository `() Ġ{ ĊĠĠĠĠĠĠĠ Ġrepository Service . create ( create Request (" test 1 ")) ĊĠĠĠĠĠĠĠ Ġrepository Service . create ( create Request (" test 2 ")) ĊĠĠĠĠĠĠĠ Ġrepository Service . delete ( Repo Delete Request ( UT _ PROJECT _ ID , Ġ" test 1 ", ĠSYSTEM _ USER )) ĊĠĠĠĠĠĠĠ ĠassertNull ( repository Service . detail ( UT _ PROJECT _ ID , Ġ" test 1 ")) ĊĊĠĠĠĠĠĠĠ ĠassertThrows < ErrorCode Exception > Ġ{ Ġrepository Service . delete ( Repo Delete Request ( UT _ PROJECT _ ID , Ġ"", ĠSYSTEM _ USER )) Ġ} ĊĠĠĠĠĠĠĠ ĠassertThrows < ErrorCode Exception > Ġ{ Ġrepository Service . delete ( Repo Delete Request ( UT _ PROJECT _ ID , Ġ" test 1 ", ĠSYSTEM _ USER )) Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertNotNull ( repository Service . detail ( UT _ PROJECT _ ID , Ġ" test 2 ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Request ( name : ĠString Ġ= ĠUT _ REPO _ NAME , Ġstorage Credentials Key : ĠString ? Ġ= Ġnull ): ĠRepo CreateRequest Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠRepo CreateRequest ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= ĠUT _ PROJECT _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠRepository Type . GENERIC , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcategory Ġ= ĠRepository Category . LOCAL , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" simple Ġdescription ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfiguration Ġ= ĠLocal Configuration (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Credentials Key Ġ= Ġstorage Credentials Key , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoperator Ġ= ĠUT _ USER ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ