Skip to content

Commit a882176

Browse files
Hotfix/7.2.1
Hotfix/7.2.1
2 parents 0fdd08e + 94a52ac commit a882176

File tree

7 files changed

+212
-91
lines changed

7 files changed

+212
-91
lines changed

CHANGELOG.md

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,20 @@
22

33
All notable changes to this project will be documented in this file.
44

5-
## [[7.2.0]](https://github.com/iExecBlockchainComputing/iexec-core/releases/tag/v7.2.0) 2022-11-29
5+
## [[7.2.1]](https://github.com/iExecBlockchainComputing/iexec-core/releases/tag/v7.2.1) 2022-12-13
6+
7+
* Replace `sessionId` implementation with a hash of the public configuration. From a consumer point of view, a constant hash received from the `POST /ping` response indicates that the scheduler configuration has not changed. With such constant hash, either the scheduler has restarted or not, the consumer does not need to reboot.
8+
9+
## [[7.2.0]](https://github.com/iExecBlockchainComputing/iexec-core/releases/tag/v7.2.0) 2022-12-09
610

711
* Increments of jenkins-library up to version 2.2.3. Enable SonarCloud analyses on branches and Pull Requests.
812
* Update `iexec-common` version to [6.1.0](https://github.com/iExecBlockchainComputing/iexec-common/releases/tag/v6.1.0).
913

10-
## [[7.1.3]](https://github.com/iExecBlockchainComputing/iexec-core/releases/tag/v7.1.3) 2022-11-29
14+
## [[7.1.3]](https://github.com/iExecBlockchainComputing/iexec-core/releases/tag/v7.1.3) 2022-12-07
1115

1216
* Bump version to 7.1.3.
1317

14-
## [[7.1.2]](https://github.com/iExecBlockchainComputing/iexec-core/releases/tag/v7.1.2) 2022-11-29
18+
## [[7.1.2]](https://github.com/iExecBlockchainComputing/iexec-core/releases/tag/v7.1.2) 2022-12-07
1519

1620
* Update README and add CHANGELOG.
1721

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
version=7.2.0
1+
version=7.2.1
22
iexecCommonVersion=6.1.0
33
iexecBlockchainAdapterVersion=7.1.1
44
iexecResultVersion=7.1.0
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
/*
2+
* Copyright 2022 IEXEC BLOCKCHAIN TECH
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.iexec.core.configuration;
18+
19+
import com.iexec.common.config.PublicConfiguration;
20+
import com.iexec.core.chain.ChainConfig;
21+
import com.iexec.core.chain.CredentialsService;
22+
import com.iexec.core.chain.adapter.BlockchainAdapterClientConfig;
23+
import org.springframework.stereotype.Service;
24+
import org.web3j.crypto.Hash;
25+
26+
import javax.annotation.PostConstruct;
27+
28+
/**
29+
* This simple service will generate a random session id when the scheduler is started, it will be send to workers when
30+
* they ping the scheduler. If they see that the session id has changed, it means that the scheduler has restarted.
31+
*/
32+
@Service
33+
public class PublicConfigurationService {
34+
private final ChainConfig chainConfig;
35+
private final CredentialsService credentialsService;
36+
private final WorkerConfiguration workerConfiguration;
37+
private final ResultRepositoryConfiguration resultRepoConfig;
38+
private final SmsConfiguration smsConfiguration;
39+
private final BlockchainAdapterClientConfig blockchainAdapterClientConfig;
40+
41+
private PublicConfiguration publicConfiguration = null;
42+
/**
43+
* {@literal publicConfigurationHash} is a Base64-encoded hash
44+
* of all {@link PublicConfiguration} fields,
45+
* concatenated with {@literal \n}.
46+
*/
47+
private String publicConfigurationHash = null;
48+
49+
public PublicConfigurationService(ChainConfig chainConfig,
50+
CredentialsService credentialsService,
51+
WorkerConfiguration workerConfiguration,
52+
ResultRepositoryConfiguration resultRepoConfig,
53+
SmsConfiguration smsConfiguration,
54+
BlockchainAdapterClientConfig blockchainAdapterClientConfig) {
55+
this.chainConfig = chainConfig;
56+
this.credentialsService = credentialsService;
57+
this.workerConfiguration = workerConfiguration;
58+
this.resultRepoConfig = resultRepoConfig;
59+
this.smsConfiguration = smsConfiguration;
60+
this.blockchainAdapterClientConfig = blockchainAdapterClientConfig;
61+
}
62+
63+
@PostConstruct
64+
void buildPublicConfiguration() {
65+
this.publicConfiguration = PublicConfiguration.builder()
66+
.workerPoolAddress(chainConfig.getPoolAddress())
67+
.blockchainAdapterUrl(blockchainAdapterClientConfig.getUrl())
68+
.schedulerPublicAddress(credentialsService.getCredentials().getAddress())
69+
.resultRepositoryURL(resultRepoConfig.getResultRepositoryURL())
70+
.smsURL(smsConfiguration.getSmsURL())
71+
.askForReplicatePeriod(workerConfiguration.getAskForReplicatePeriod())
72+
.requiredWorkerVersion(workerConfiguration.getRequiredWorkerVersion())
73+
.build();
74+
75+
// TODO: would be great to put this in Common
76+
// (a simple `@ToString` would be sufficient)
77+
final String publicConfigurationAsString = String.join("\n",
78+
publicConfiguration.getWorkerPoolAddress(),
79+
publicConfiguration.getBlockchainAdapterUrl(),
80+
publicConfiguration.getSchedulerPublicAddress(),
81+
publicConfiguration.getResultRepositoryURL(),
82+
publicConfiguration.getSmsURL(),
83+
publicConfiguration.getAskForReplicatePeriod() + "",
84+
publicConfiguration.getRequiredWorkerVersion()
85+
);
86+
87+
this.publicConfigurationHash = Hash.sha3String(publicConfigurationAsString);
88+
}
89+
90+
public String getPublicConfigurationHash() {
91+
if (publicConfigurationHash == null) {
92+
throw new IllegalArgumentException("Public configuration hash accessed before initialization.");
93+
}
94+
return publicConfigurationHash;
95+
}
96+
97+
public PublicConfiguration getPublicConfiguration() {
98+
if (publicConfiguration == null) {
99+
throw new IllegalArgumentException("Public configuration accessed before initialization.");
100+
}
101+
return publicConfiguration;
102+
}
103+
}

src/main/java/com/iexec/core/configuration/SessionService.java

Lines changed: 0 additions & 32 deletions
This file was deleted.

src/main/java/com/iexec/core/worker/WorkerController.java

Lines changed: 7 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,7 @@
2121
import com.iexec.common.security.Signature;
2222
import com.iexec.common.utils.BytesUtils;
2323
import com.iexec.common.utils.SignatureUtils;
24-
import com.iexec.core.chain.ChainConfig;
25-
import com.iexec.core.chain.CredentialsService;
26-
import com.iexec.core.chain.adapter.BlockchainAdapterClientConfig;
27-
import com.iexec.core.configuration.ResultRepositoryConfiguration;
28-
import com.iexec.core.configuration.SessionService;
29-
import com.iexec.core.configuration.SmsConfiguration;
30-
import com.iexec.core.configuration.WorkerConfiguration;
24+
import com.iexec.core.configuration.PublicConfigurationService;
3125
import com.iexec.core.security.ChallengeService;
3226
import com.iexec.core.security.JwtTokenProvider;
3327
import lombok.extern.slf4j.Slf4j;
@@ -48,33 +42,18 @@
4842
public class WorkerController {
4943

5044
private final WorkerService workerService;
51-
private final ChainConfig chainConfig;
52-
private final CredentialsService credentialsService;
5345
private final JwtTokenProvider jwtTokenProvider;
5446
private final ChallengeService challengeService;
55-
private final WorkerConfiguration workerConfiguration;
56-
private final ResultRepositoryConfiguration resultRepoConfig;
57-
private final SmsConfiguration smsConfiguration;
58-
private final BlockchainAdapterClientConfig blockchainAdapterClientConfig;
47+
private final PublicConfigurationService publicConfigurationService;
5948

6049
public WorkerController(WorkerService workerService,
61-
ChainConfig chainConfig,
62-
CredentialsService credentialsService,
6350
JwtTokenProvider jwtTokenProvider,
6451
ChallengeService challengeService,
65-
WorkerConfiguration workerConfiguration,
66-
ResultRepositoryConfiguration resultRepoConfig,
67-
SmsConfiguration smsConfiguration,
68-
BlockchainAdapterClientConfig blockchainAdapterClientConfig) {
52+
PublicConfigurationService publicConfigurationService) {
6953
this.workerService = workerService;
70-
this.chainConfig = chainConfig;
71-
this.credentialsService = credentialsService;
7254
this.jwtTokenProvider = jwtTokenProvider;
7355
this.challengeService = challengeService;
74-
this.workerConfiguration = workerConfiguration;
75-
this.resultRepoConfig = resultRepoConfig;
76-
this.smsConfiguration = smsConfiguration;
77-
this.blockchainAdapterClientConfig = blockchainAdapterClientConfig;
56+
this.publicConfigurationService = publicConfigurationService;
7857
}
7958

8059
@PostMapping(path = "/workers/ping")
@@ -83,8 +62,9 @@ public ResponseEntity<String> ping(@RequestHeader("Authorization") String bearer
8362
if (workerWalletAddress.isEmpty()) {
8463
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
8564
}
65+
final String publicConfigurationHash = publicConfigurationService.getPublicConfigurationHash();
8666
return workerService.updateLastAlive(workerWalletAddress)
87-
.map(worker -> ok(SessionService.getSessionId()))
67+
.map(worker -> ok(publicConfigurationHash))
8868
.orElseGet(() -> status(HttpStatus.NOT_FOUND).build());
8969
}
9070

@@ -148,16 +128,7 @@ public ResponseEntity<Worker> registerWorker(@RequestHeader("Authorization") Str
148128

149129
@GetMapping(path = "/workers/config")
150130
public ResponseEntity<PublicConfiguration> getPublicConfiguration() {
151-
PublicConfiguration config = PublicConfiguration.builder()
152-
.workerPoolAddress(chainConfig.getPoolAddress())
153-
.blockchainAdapterUrl(blockchainAdapterClientConfig.getUrl())
154-
.schedulerPublicAddress(credentialsService.getCredentials().getAddress())
155-
.resultRepositoryURL(resultRepoConfig.getResultRepositoryURL())
156-
.smsURL(smsConfiguration.getSmsURL())
157-
.askForReplicatePeriod(workerConfiguration.getAskForReplicatePeriod())
158-
.requiredWorkerVersion(workerConfiguration.getRequiredWorkerVersion())
159-
.build();
160-
131+
final PublicConfiguration config = publicConfigurationService.getPublicConfiguration();
161132
return ok(config);
162133
}
163134

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
/*
2+
* Copyright 2022 IEXEC BLOCKCHAIN TECH
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.iexec.core.configuration;
18+
19+
import com.iexec.core.chain.ChainConfig;
20+
import com.iexec.core.chain.CredentialsService;
21+
import com.iexec.core.chain.adapter.BlockchainAdapterClientConfig;
22+
import org.junit.jupiter.api.BeforeEach;
23+
import org.junit.jupiter.api.Test;
24+
import org.mockito.InjectMocks;
25+
import org.mockito.Mock;
26+
import org.mockito.MockitoAnnotations;
27+
import org.web3j.crypto.Credentials;
28+
29+
import java.security.NoSuchAlgorithmException;
30+
31+
import static org.junit.jupiter.api.Assertions.assertNotNull;
32+
import static org.junit.jupiter.api.Assertions.assertThrows;
33+
import static org.mockito.Mockito.mock;
34+
import static org.mockito.Mockito.when;
35+
36+
class PublicConfigurationServiceTests {
37+
@Mock
38+
private ChainConfig chainConfig;
39+
@Mock
40+
private CredentialsService credentialsService;
41+
@Mock
42+
private WorkerConfiguration workerConfiguration;
43+
@Mock
44+
private ResultRepositoryConfiguration resultRepoConfig;
45+
@Mock
46+
private SmsConfiguration smsConfiguration;
47+
@Mock
48+
private BlockchainAdapterClientConfig blockchainAdapterClientConfig;
49+
50+
@InjectMocks
51+
private PublicConfigurationService publicConfigurationService;
52+
53+
@BeforeEach
54+
void init() {
55+
MockitoAnnotations.openMocks(this);
56+
when(credentialsService.getCredentials()).thenReturn(mock(Credentials.class));
57+
}
58+
59+
// region getPublicConfiguration
60+
@Test
61+
void shouldGetPublicConfiguration() throws NoSuchAlgorithmException {
62+
// This would be done by Spring in production
63+
publicConfigurationService.buildPublicConfiguration();
64+
65+
assertNotNull(publicConfigurationService.getPublicConfiguration());
66+
}
67+
68+
@Test
69+
void shouldNotGetPublicConfigurationWhenNotInitialized() {
70+
assertThrows(IllegalArgumentException.class, publicConfigurationService::getPublicConfiguration);
71+
}
72+
// endregion
73+
74+
// region getPublicConfiguration
75+
@Test
76+
void shouldGetPublicConfigurationHash() throws NoSuchAlgorithmException {
77+
// This would be done by Spring in production
78+
publicConfigurationService.buildPublicConfiguration();
79+
80+
assertNotNull(publicConfigurationService.getPublicConfigurationHash());
81+
}
82+
83+
@Test
84+
void shouldNotGetPublicConfigurationHashWhenNotInitialized() {
85+
assertThrows(IllegalArgumentException.class, publicConfigurationService::getPublicConfigurationHash);
86+
}
87+
// endregion
88+
}

0 commit comments

Comments
 (0)