Skip to content

Commit ee83cd2

Browse files
hrzzzzruihongzhou
andauthored
feat: Support different environments to use different tokens (#500)
Co-authored-by: ruihongzhou <ruihongzhou@tencent.com>
1 parent c2b8b99 commit ee83cd2

File tree

16 files changed

+126
-20
lines changed

16 files changed

+126
-20
lines changed

front-end/src/lang/en.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -763,10 +763,14 @@ export default {
763763
updateEnvNameLabel: 'Environment Name',
764764
updateEnvServiceUrlPlaceHolder: 'Please input environment service url',
765765
updateEnvBookieUrlPlaceHolder: 'Please input environment bookie url',
766+
updateEnvTokenPlaceHolder: 'Please input environment token',
766767
newEnvBookieUrlPlaceHolder: 'Please input environment bookie url',
768+
newEnvTokenPlaceHolder: 'Please input environment token',
767769
updateEnvServiceUrlLabel: 'Service URL',
768770
updateEnvBookieUrlLabel: 'Bookie URL',
771+
updateEnvTokenLabel: "Token",
769772
newEnvBookieUrlLabel: 'Bookie URL',
773+
newEnvTokenLabel: 'Token',
770774
deleteEnvDialogCaption: 'Delete Environment',
771775
deleteEnvDialogText: 'Are you sure you want to delete this environment?',
772776
envNameIsRequired: 'Environment Name is required',

front-end/src/lang/zh.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -757,14 +757,18 @@ export default {
757757
newEnvNameLabel: 'Environment Name',
758758
newEnvServiceUrlPlaceHolder: 'Please input environment service url',
759759
newEnvBookieUrlPlaceHolder: 'Please input environment bookie url',
760+
newEnvTokenPlaceHolder: 'Please input environment token',
760761
newEnvServiceUrlLabel: 'Service URL',
761762
newEnvBookieUrlLabel: 'Bookie URL',
763+
newEnvTokenLabel: 'Token',
762764
updateEnvDialogCaption: 'Update Environment',
763765
updateEnvNameLabel: 'Environment Name',
764766
updateEnvServiceUrlPlaceHolder: 'Please input environment service url',
765767
updateEnvBookieUrlPlaceHolder: 'Please input environment bookie url',
768+
updateEnvTokenPlaceHolder: 'Please input environment token',
766769
updateEnvServiceUrlLabel: 'Service URL',
767770
updateEnvBookieUrlLabel: 'Bookie URL',
771+
updateEnvTokenLabel: "Token",
768772
deleteEnvDialogCaption: 'Delete Environment',
769773
deleteEnvDialogText: 'Are you sure you want to delete this environment?',
770774
envNameIsRequired: 'Environment Name is required',

front-end/src/views/management/environments/index.vue

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@
6767
<el-input v-model="form.bookie" :placeholder="$t('env.newEnvBookieUrlPlaceHolder')"/>
6868
</el-form-item>
6969

70+
<el-form-item v-if="dialogStatus==='create'" :label="$t('env.newEnvTokenLabel')" prop="token">
71+
<el-input v-model="form.token" :placeholder="$t('env.newEnvTokenPlaceHolder')"/>
72+
</el-form-item>
73+
7074
<el-form-item v-if="dialogStatus==='update'" :label="$t('env.updateEnvNameLabel')">
7175
<el-tag type="primary" size="medium">{{ form.environment }}</el-tag>
7276
</el-form-item>
@@ -77,6 +81,11 @@
7781
<el-form-item v-if="dialogStatus==='update'" :label="$t('env.updateEnvBookieUrlLabel')" prop="bookie">
7882
<el-input v-model="form.bookie" :placeholder="$t('env.updateEnvBookieUrlPlaceHolder')"/>
7983
</el-form-item>
84+
85+
<el-form-item v-if="dialogStatus==='update'" :label="$t('env.updateEnvTokenLabel')" prop="token">
86+
<el-input v-model="form.token" :placeholder="$t('env.updateEnvTokenPlaceHolder')"/>
87+
</el-form-item>
88+
8089
<el-form-item v-if="dialogStatus==='delete'">
8190
<h4>{{ $t('env.deleteEnvDialogText') }}</h4>
8291
</el-form-item>
@@ -111,19 +120,22 @@
111120
form: {
112121
environment: '',
113122
broker: '',
114-
bookie: ''
123+
bookie: '',
124+
token: null
115125
},
116126
temp: {
117127
'name': '',
118128
'broker': '',
119-
'bookie': ''
129+
'bookie': '',
130+
'token': '',
120131
},
121132
superUser: false,
122133
roles: [],
123134
rules: {
124135
environment: [{ required: true, message: this.$i18n.t('env.envNameIsRequired'), trigger: 'blur' }],
125136
broker: [{ required: true, message: this.$i18n.t('env.serviceUrlIsRequired'), trigger: 'blur' }],
126-
bookie: [{ required: true, message: this.$i18n.t('env.bookieUrlIsRequired'), trigger: 'blur' }]
137+
bookie: [{ required: true, message: this.$i18n.t('env.bookieUrlIsRequired'), trigger: 'blur' }],
138+
token: [{ required: false }]
127139
}
128140
}
129141
},
@@ -145,7 +157,8 @@
145157
this.environmentList.push({
146158
'environment': response.data.data[i].name,
147159
'broker': response.data.data[i].broker,
148-
'bookie': response.data.data[i].bookie
160+
'bookie': response.data.data[i].bookie,
161+
'token': response.data.data[i].token
149162
})
150163
}
151164
})
@@ -166,6 +179,7 @@
166179
this.form.environment = row.environment
167180
this.form.broker = row.broker
168181
this.form.bookie = row.bookie
182+
this.form.token = row.token
169183
this.dialogFormVisible = true
170184
this.dialogStatus = 'update'
171185
},
@@ -190,7 +204,8 @@
190204
const data = {
191205
'name': this.form.environment,
192206
'broker': this.form.broker,
193-
'bookie': this.form.bookie
207+
'bookie': this.form.bookie,
208+
'token': this.form.token
194209
}
195210
putEnvironment(data).then(response => {
196211
if (!response.data) return
@@ -243,7 +258,8 @@
243258
const data = {
244259
'name': this.form.environment,
245260
'broker': this.form.broker,
246-
'bookie': this.form.bookie
261+
'bookie': this.form.bookie,
262+
'token': this.form.token
247263
}
248264
updateEnvironment(data).then(response => {
249265
if (!response.data) return

src/main/java/org/apache/pulsar/manager/controller/EnvironmentsController.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ public ResponseEntity<Map<String, Object>> addEnvironment(
120120
return ResponseEntity.ok(result);
121121
}
122122
try {
123-
pulsarAdminService.clusters(environmentEntity.getBroker()).getClusters();
123+
pulsarAdminService.clusters(environmentEntity.getBroker(), environmentEntity.getToken()).getClusters();
124124
} catch (PulsarAdminException e) {
125125
log.error("Failed to get clusters list.", e);
126126
result.put("error", "This environment is error. Please check it");
@@ -147,7 +147,7 @@ public ResponseEntity<Map<String, Object>> updateEnvironment(@RequestBody Enviro
147147
return ResponseEntity.ok(result);
148148
}
149149
try {
150-
pulsarAdminService.clusters(environmentEntity.getBroker()).getClusters();
150+
pulsarAdminService.clusters(environmentEntity.getBroker(), environmentEntity.getToken()).getClusters();
151151
} catch (PulsarAdminException e) {
152152
log.error("Failed to get clusters list.", e);
153153
result.put("error", "This environment is error. Please check it");

src/main/java/org/apache/pulsar/manager/entity/EnvironmentEntity.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,5 @@ public class EnvironmentEntity {
2727
private String name;
2828
private String broker;
2929
private String bookie;
30+
private String token;
3031
}

src/main/java/org/apache/pulsar/manager/mapper/EnvironmentsMapper.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,28 +22,28 @@
2222
@Mapper
2323
public interface EnvironmentsMapper {
2424

25-
@Insert("INSERT INTO environments(name,broker,bookie) VALUES(#{name},#{broker},#{bookie})")
25+
@Insert("INSERT INTO environments(name,broker,bookie,token) VALUES(#{name},#{broker},#{bookie},#{token})")
2626
void insert(EnvironmentEntity environmentEntity);
2727

28-
@Select("SELECT name,broker,bookie FROM environments where broker=#{broker}")
28+
@Select("SELECT name,broker,bookie,token FROM environments where broker=#{broker}")
2929
EnvironmentEntity findByBroker(String broker);
3030

31-
@Select("SELECT name,broker,bookie FROM environments where name=#{name}")
31+
@Select("SELECT name,broker,bookie,token FROM environments where name=#{name}")
3232
EnvironmentEntity findByName(String name);
3333

34-
@Select("SELECT name,broker,bookie FROM environments")
34+
@Select("SELECT name,broker,bookie,token FROM environments")
3535
Page<EnvironmentEntity> findEnvironmentsList();
3636

3737
@Select({"<script>",
38-
"SELECT name,broker,bookie FROM environments",
38+
"SELECT name,broker,bookie,token FROM environments",
3939
"WHERE name IN <foreach collection='nameList' item='name' open='(' separator=',' close=')'> #{name} </foreach>" +
4040
"</script>"})
4141
Page<EnvironmentEntity> findEnvironmentsListByMultiName(@Param("nameList") List<String> nameList);
4242

43-
@Select("SELECT name,broker,bookie FROM environments")
43+
@Select("SELECT name,broker,bookie,token FROM environments")
4444
List<EnvironmentEntity> getAllEnvironments();
4545

46-
@Update("UPDATE environments set broker=#{broker},bookie=#{bookie} where name=#{name}")
46+
@Update("UPDATE environments set broker=#{broker},bookie=#{bookie},token=#{token} where name=#{name}")
4747
void update(EnvironmentEntity environmentEntity);
4848

4949
@Delete("DELETE FROM environments WHERE name=#{name}")

src/main/java/org/apache/pulsar/manager/service/EnvironmentCacheService.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,20 @@ public interface EnvironmentCacheService {
5050
*/
5151
String getServiceUrl(String environment, String cluster);
5252

53+
/**
54+
* Return the environment name for a given service url.
55+
* @param serviceUrl
56+
* @return
57+
*/
58+
String getEnvironment(String serviceUrl);
59+
60+
/**
61+
* Set the mapping of serviceUrl and environment.
62+
* @param serviceUrl
63+
* @param environment
64+
*/
65+
void setServiceUrlEnvironmentMapping(String serviceUrl, String environment);
66+
5367
/**
5468
* Refresh all the environments.
5569
*/

src/main/java/org/apache/pulsar/manager/service/PulsarAdminService.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public interface PulsarAdminService {
2727
PulsarAdmin getPulsarAdmin(String url);
2828
BrokerStats brokerStats(String url);
2929
Clusters clusters(String url);
30+
Clusters clusters(String url, String token);
3031
Brokers brokers(String url);
3132
Tenants tenants(String url);
3233
Namespaces namespaces(String url);

src/main/java/org/apache/pulsar/manager/service/impl/BrokersServiceImpl.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.apache.pulsar.common.policies.data.FailureDomain;
2020
import org.apache.pulsar.manager.controller.exception.PulsarAdminOperationException;
2121
import org.apache.pulsar.manager.service.BrokersService;
22+
import org.apache.pulsar.manager.service.EnvironmentCacheService;
2223
import org.apache.pulsar.manager.service.PulsarAdminService;
2324
import org.springframework.beans.factory.annotation.Autowired;
2425
import org.springframework.beans.factory.annotation.Value;
@@ -37,9 +38,12 @@ public class BrokersServiceImpl implements BrokersService {
3738

3839
private final PulsarAdminService pulsarAdminService;
3940

41+
private final EnvironmentCacheService environmentCacheService;
42+
4043
@Autowired
41-
public BrokersServiceImpl(PulsarAdminService pulsarAdminService) {
44+
public BrokersServiceImpl(PulsarAdminService pulsarAdminService, EnvironmentCacheService environmentCacheService) {
4245
this.pulsarAdminService = pulsarAdminService;
46+
this.environmentCacheService = environmentCacheService;
4347
}
4448

4549

@@ -67,7 +71,10 @@ public Map<String, Object> getBrokersList(Integer pageNum, Integer pageSize, Str
6771
throw pulsarAdminOperationException;
6872
}
6973

74+
String environment = environmentCacheService.getEnvironment(requestHost);
75+
7076
for (String broker: brokersList) {
77+
environmentCacheService.setServiceUrlEnvironmentMapping("http://" + broker, environment);
7178
Map<String, Object> brokerEntity = Maps.newHashMap();
7279
List<String> failureDomain = this.getFailureDomain(broker, failureDomains);
7380
brokerEntity.put("broker", broker);

src/main/java/org/apache/pulsar/manager/service/impl/EnvironmentCacheServiceImpl.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,14 @@ public class EnvironmentCacheServiceImpl implements EnvironmentCacheService {
5151

5252
private final PulsarAdminService pulsarAdminService;
5353

54+
private final Map<String, String> serviceUrlEnvironmentMap;
55+
5456
@Autowired
5557
public EnvironmentCacheServiceImpl(EnvironmentsRepository environmentsRepository, PulsarAdminService pulsarAdminService) {
5658
this.environmentsRepository = environmentsRepository;
5759
this.environments = new ConcurrentHashMap<>();
5860
this.pulsarAdminService = pulsarAdminService;
61+
this.serviceUrlEnvironmentMap = new ConcurrentHashMap<>();
5962
}
6063

6164
@Override
@@ -93,6 +96,16 @@ public String getServiceUrl(String environment, String cluster) {
9396
}
9497
}
9598

99+
@Override
100+
public void setServiceUrlEnvironmentMapping(String serviceUrl, String environment) {
101+
serviceUrlEnvironmentMap.put(serviceUrl, environment);
102+
}
103+
104+
@Override
105+
public String getEnvironment(String serviceUrl) {
106+
return serviceUrlEnvironmentMap.get(serviceUrl);
107+
}
108+
96109
private String pickOneServiceUrl(String webServiceUrl) {
97110
if (webServiceUrl.contains(",")) {
98111
String[] webServiceUrlList = webServiceUrl.split(",");
@@ -215,6 +228,7 @@ private ClusterData reloadCluster(EnvironmentEntity environment, String cluster)
215228
environment.getName(),
216229
(e) -> new ConcurrentHashMap<>());
217230
clusters.put(cluster, clusterData);
231+
serviceUrlEnvironmentMap.put(environment.getBroker(), environment.getName());
218232
log.info("Successfully loaded cluster data for cluster {} @ environment {} : {}",
219233
cluster, environment.getName(), clusterData);
220234
return clusterData;

src/main/java/org/apache/pulsar/manager/service/impl/PulsarAdminServiceImpl.java

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import java.net.URL;
1818
import java.util.HashMap;
1919
import java.util.Map;
20+
import java.util.Optional;
2021
import java.util.Set;
2122
import java.util.concurrent.CompletableFuture;
2223

@@ -35,7 +36,11 @@
3536
import org.apache.pulsar.client.api.AuthenticationFactory;
3637
import org.apache.pulsar.client.api.PulsarClientException;
3738
import org.apache.pulsar.manager.controller.exception.PulsarAdminOperationException;
39+
import org.apache.pulsar.manager.entity.EnvironmentEntity;
40+
import org.apache.pulsar.manager.entity.EnvironmentsRepository;
41+
import org.apache.pulsar.manager.service.EnvironmentCacheService;
3842
import org.apache.pulsar.manager.service.PulsarAdminService;
43+
import org.springframework.beans.factory.annotation.Autowired;
3944
import org.springframework.beans.factory.annotation.Value;
4045
import org.springframework.stereotype.Service;
4146

@@ -63,18 +68,28 @@ public class PulsarAdminServiceImpl implements PulsarAdminService {
6368

6469
private Map<String, PulsarAdmin> pulsarAdmins = new HashMap<>();
6570

71+
@Autowired
72+
private EnvironmentsRepository environmentsRepository;
73+
74+
@Autowired
75+
private EnvironmentCacheService environmentCacheService;
76+
6677
@PreDestroy
6778
public void destroy() {
6879
pulsarAdmins.values().forEach(value -> value.close());
6980
}
7081

7182
public synchronized PulsarAdmin getPulsarAdmin(String url) {
7283
if (!pulsarAdmins.containsKey(url)) {
73-
pulsarAdmins.put(url, this.createPulsarAdmin(url));
84+
pulsarAdmins.put(url, this.createPulsarAdmin(url, null));
7485
}
7586
return pulsarAdmins.get(url);
7687
}
7788

89+
public PulsarAdmin getPulsarAdmin(String url, String token) {
90+
return this.createPulsarAdmin(url, token);
91+
}
92+
7893
public BrokerStats brokerStats(String url) {
7994
return getPulsarAdmin(url).brokerStats();
8095
}
@@ -83,6 +98,11 @@ public Clusters clusters(String url) {
8398
return getPulsarAdmin(url).clusters();
8499
}
85100

101+
@Override
102+
public Clusters clusters(String url, String token) {
103+
return getPulsarAdmin(url, token).clusters();
104+
}
105+
86106
public Brokers brokers(String url) {
87107
return getPulsarAdmin(url).brokers();
88108
}
@@ -129,13 +149,28 @@ public Map<String, String> getAuthHeader(String url) {
129149
return result;
130150
}
131151

132-
private PulsarAdmin createPulsarAdmin(String url) {
152+
private String getEnvironmentToken(String url) {
153+
Optional<EnvironmentEntity> optionalEnvironmentEntity = environmentsRepository.findByBroker(url);
154+
if (optionalEnvironmentEntity.isPresent()) {
155+
return optionalEnvironmentEntity.get().getToken();
156+
}
157+
String environment = environmentCacheService.getEnvironment(url);
158+
Optional<EnvironmentEntity> environmentEntityOptional = environmentsRepository.findByName(environment);
159+
return environmentEntityOptional.map(EnvironmentEntity::getToken).orElse(null);
160+
}
161+
162+
private PulsarAdmin createPulsarAdmin(String url, String token) {
133163
try {
134164
log.info("Create Pulsar Admin instance. url={}, authPlugin={}, authParams={}, tlsAllowInsecureConnection={}, tlsTrustCertsFilePath={}, tlsEnableHostnameVerification={}",
135165
url, authPlugin, authParams, tlsAllowInsecureConnection, tlsTrustCertsFilePath, tlsEnableHostnameVerification);
136166
PulsarAdminBuilder pulsarAdminBuilder = PulsarAdmin.builder();
137167
pulsarAdminBuilder.serviceHttpUrl(url);
138-
if (StringUtils.isNotBlank(pulsarJwtToken)) {
168+
if (null == token) {
169+
token = getEnvironmentToken(url);
170+
}
171+
if (StringUtils.isNotBlank(token)) {
172+
pulsarAdminBuilder.authentication(AuthenticationFactory.token(token));
173+
} else if (StringUtils.isNotBlank(pulsarJwtToken)) {
139174
pulsarAdminBuilder.authentication(AuthenticationFactory.token(pulsarJwtToken));
140175
} else {
141176
pulsarAdminBuilder.authentication(authPlugin, authParams);

src/main/resources/META-INF/sql/herddb-schema.sql

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
CREATE TABLE IF NOT EXISTS environments (
1717
name varchar(256) NOT NULL PRIMARY KEY,
1818
broker varchar(1024) NOT NULL,
19-
bookie varchar(1024) NOT NULL
19+
bookie varchar(1024) NOT NULL,
20+
token varchar(1024)
2021
);
2122

2223
CREATE TABLE IF NOT EXISTS topics_stats (

src/main/resources/META-INF/sql/mysql-schema.sql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ CREATE TABLE IF NOT EXISTS environments (
2020
name varchar(256) NOT NULL,
2121
broker varchar(1024) NOT NULL,
2222
bookie varchar(1024) NOT NULL,
23+
token varchar(1024),
2324
CONSTRAINT PK_name PRIMARY KEY (name),
2425
UNIQUE (broker)
2526
)ENGINE=InnoDB CHARACTER SET utf8;

0 commit comments

Comments
 (0)