1616
1717package com .iexec .sms .tee .session .scone ;
1818
19+ import com .iexec .common .utils .FeignBuilder ;
1920import com .iexec .commons .poco .tee .TeeFramework ;
2021import com .iexec .sms .tee .ConditionalOnTeeFramework ;
2122import com .iexec .sms .tee .session .base .SecretEnclaveBase ;
3031import com .iexec .sms .tee .session .scone .cas .SconeSession .Image .Volume ;
3132import com .iexec .sms .tee .session .scone .cas .SconeSession .Security ;
3233import com .iexec .sms .tee .session .scone .cas .SconeSession .Volumes ;
34+ import feign .Logger ;
3335import lombok .NonNull ;
36+ import lombok .extern .slf4j .Slf4j ;
3437import org .springframework .stereotype .Service ;
3538
39+ import java .net .URL ;
3640import java .util .*;
41+ import java .util .stream .Collectors ;
3742
3843//TODO Rename and move
44+ @ Slf4j
3945@ Service
4046@ ConditionalOnTeeFramework (frameworks = TeeFramework .SCONE )
4147public class SconeSessionMakerService {
4248
4349 private final SecretSessionBaseService secretSessionBaseService ;
4450 private final SconeSessionSecurityConfig attestationSecurityConfig ;
51+ private final Map <URL , AzureAttestationServer > azureAttestationServersMap ;
4552
46- public SconeSessionMakerService (
47- SecretSessionBaseService secretSessionBaseService ,
48- SconeSessionSecurityConfig attestationSecurityConfig ) {
53+ public SconeSessionMakerService (final SecretSessionBaseService secretSessionBaseService ,
54+ final SconeSessionSecurityConfig attestationSecurityConfig ) {
4955 this .secretSessionBaseService = secretSessionBaseService ;
5056 this .attestationSecurityConfig = attestationSecurityConfig ;
57+ azureAttestationServersMap = attestationSecurityConfig .getUrls ().stream ()
58+ .collect (Collectors .toMap (
59+ url -> url ,
60+ url -> FeignBuilder .createBuilder (Logger .Level .BASIC ).target (AzureAttestationServer .class , url .toString ())
61+ ));
5162 }
5263
5364 /**
@@ -62,21 +73,19 @@ public SconeSessionMakerService(
6273 * @return session config in yaml string format
6374 */
6475 @ NonNull
65- public SconeSession generateSession (TeeSessionRequest request )
66- throws TeeSessionGenerationException {
67- Volume iexecInVolume = new Volume ("iexec_in" , "/iexec_in" );
68- Volume iexecOutVolume = new Volume ("iexec_out" , "/iexec_out" );
69- Volume postComputeTmpVolume = new Volume ("post-compute-tmp" ,
70- "/post-compute-tmp" );
71- List <SconeEnclave > services = new ArrayList <>();
72- List <Image > images = new ArrayList <>();
76+ public SconeSession generateSession (final TeeSessionRequest request ) throws TeeSessionGenerationException {
77+ final Volume iexecInVolume = new Volume ("iexec_in" , "/iexec_in" );
78+ final Volume iexecOutVolume = new Volume ("iexec_out" , "/iexec_out" );
79+ final Volume postComputeTmpVolume = new Volume ("post-compute-tmp" , "/post-compute-tmp" );
80+ final List <SconeEnclave > services = new ArrayList <>();
81+ final List <Image > images = new ArrayList <>();
7382
74- SecretSessionBase baseSession = secretSessionBaseService
83+ final SecretSessionBase baseSession = secretSessionBaseService
7584 .getSecretsTokens (request );
7685
7786 // pre (optional)
7887 if (baseSession .getPreCompute () != null ) {
79- SconeEnclave sconePreEnclave = toSconeEnclave (
88+ final SconeEnclave sconePreEnclave = toSconeEnclave (
8089 baseSession .getPreCompute (),
8190 request .getTeeServicesProperties ().getPreComputeProperties ().getEntrypoint (),
8291 true );
@@ -86,7 +95,7 @@ public SconeSession generateSession(TeeSessionRequest request)
8695 List .of (iexecInVolume )));
8796 }
8897 // app
89- SconeEnclave sconeAppEnclave = toSconeEnclave (
98+ final SconeEnclave sconeAppEnclave = toSconeEnclave (
9099 baseSession .getAppCompute (),
91100 request .getTaskDescription ().getAppCommand (),
92101 false );
@@ -95,7 +104,7 @@ public SconeSession generateSession(TeeSessionRequest request)
95104 sconeAppEnclave .getImageName (),
96105 List .of (iexecInVolume , iexecOutVolume )));
97106 // post
98- SconeEnclave sconePostEnclave = toSconeEnclave (
107+ final SconeEnclave sconePostEnclave = toSconeEnclave (
99108 baseSession .getPostCompute (),
100109 request .getTeeServicesProperties ().getPostComputeProperties ().getEntrypoint (),
101110 true );
@@ -104,6 +113,8 @@ public SconeSession generateSession(TeeSessionRequest request)
104113 sconePostEnclave .getImageName (),
105114 List .of (iexecOutVolume , postComputeTmpVolume )));
106115
116+ final URL validAttestationServer = resolveValidAttestationServer ();
117+
107118 return SconeSession .builder ()
108119 .name (request .getSessionId ())
109120 .version ("0.3.10" )
@@ -118,13 +129,31 @@ public SconeSession generateSession(TeeSessionRequest request)
118129 attestationSecurityConfig .getToleratedInsecureOptions (),
119130 attestationSecurityConfig .getIgnoredSgxAdvisories (),
120131 attestationSecurityConfig .getMode (),
121- attestationSecurityConfig . getUrl ()
132+ validAttestationServer
122133 )
123134 )
124135 .build ();
125136 }
126137
127- private SconeEnclave toSconeEnclave (SecretEnclaveBase enclaveBase , String command , boolean addJavaEnvVars ) {
138+ private URL resolveValidAttestationServer () {
139+ // The keys of the Map are shuffled to avoid always querying servers in the same order
140+ final List <URL > urls = new ArrayList <>(azureAttestationServersMap .keySet ());
141+ Collections .shuffle (urls );
142+ for (final URL attestationServerUrl : urls ) {
143+ try {
144+ azureAttestationServersMap .get (attestationServerUrl ).canFetchOpenIdMetadata ();
145+ log .debug ("Resolved attestation server [url:{}]" , attestationServerUrl );
146+ return attestationServerUrl ;
147+ } catch (Exception e ) {
148+ log .error ("Failed to check Azure attestation server liveness [url:{}]" , attestationServerUrl , e );
149+ }
150+ }
151+ return null ;
152+ }
153+
154+ private SconeEnclave toSconeEnclave (final SecretEnclaveBase enclaveBase ,
155+ final String command ,
156+ final boolean addJavaEnvVars ) {
128157 final HashMap <String , Object > enclaveEnvironment = new HashMap <>(enclaveBase .getEnvironment ());
129158 if (addJavaEnvVars ) {
130159 enclaveEnvironment .putAll (
0 commit comments