in common/domain/handler.go [134:301]
func (d *handlerImpl) RegisterDomain(
ctx context.Context,
registerRequest *types.RegisterDomainRequest,
) error {
// cluster global domain enabled
if !d.clusterMetadata.IsPrimaryCluster() && registerRequest.GetIsGlobalDomain() {
return errNotPrimaryCluster
}
// first check if the name is already registered as the local domain
_, err := d.domainManager.GetDomain(ctx, &persistence.GetDomainRequest{Name: registerRequest.GetName()})
switch err.(type) {
case nil:
// domain already exists, cannot proceed
return &types.DomainAlreadyExistsError{Message: "Domain already exists."}
case *types.EntityNotExistsError:
// domain does not exists, proceeds
default:
// other err
return err
}
// input validation on domain name
matchedRegex, err := regexp.MatchString("^[a-zA-Z0-9-]+$", registerRequest.GetName())
if err != nil {
return err
}
if !matchedRegex {
return errInvalidDomainName
}
activeClusterName := d.clusterMetadata.GetCurrentClusterName()
// input validation on cluster names
if registerRequest.ActiveClusterName != "" {
activeClusterName = registerRequest.GetActiveClusterName()
}
clusters := []*persistence.ClusterReplicationConfig{}
for _, clusterConfig := range registerRequest.Clusters {
clusterName := clusterConfig.GetClusterName()
clusters = append(clusters, &persistence.ClusterReplicationConfig{ClusterName: clusterName})
}
clusters = cluster.GetOrUseDefaultClusters(activeClusterName, clusters)
currentHistoryArchivalState := neverEnabledState()
nextHistoryArchivalState := currentHistoryArchivalState
clusterHistoryArchivalConfig := d.archivalMetadata.GetHistoryConfig()
if clusterHistoryArchivalConfig.ClusterConfiguredForArchival() {
archivalEvent, err := d.toArchivalRegisterEvent(
registerRequest.HistoryArchivalStatus,
registerRequest.GetHistoryArchivalURI(),
clusterHistoryArchivalConfig.GetDomainDefaultStatus(),
clusterHistoryArchivalConfig.GetDomainDefaultURI(),
)
if err != nil {
return err
}
nextHistoryArchivalState, _, err = currentHistoryArchivalState.getNextState(archivalEvent, d.validateHistoryArchivalURI)
if err != nil {
return err
}
}
currentVisibilityArchivalState := neverEnabledState()
nextVisibilityArchivalState := currentVisibilityArchivalState
clusterVisibilityArchivalConfig := d.archivalMetadata.GetVisibilityConfig()
if clusterVisibilityArchivalConfig.ClusterConfiguredForArchival() {
archivalEvent, err := d.toArchivalRegisterEvent(
registerRequest.VisibilityArchivalStatus,
registerRequest.GetVisibilityArchivalURI(),
clusterVisibilityArchivalConfig.GetDomainDefaultStatus(),
clusterVisibilityArchivalConfig.GetDomainDefaultURI(),
)
if err != nil {
return err
}
nextVisibilityArchivalState, _, err = currentVisibilityArchivalState.getNextState(archivalEvent, d.validateVisibilityArchivalURI)
if err != nil {
return err
}
}
info := &persistence.DomainInfo{
ID: uuid.New(),
Name: registerRequest.GetName(),
Status: persistence.DomainStatusRegistered,
OwnerEmail: registerRequest.GetOwnerEmail(),
Description: registerRequest.GetDescription(),
Data: registerRequest.Data,
}
config := &persistence.DomainConfig{
Retention: registerRequest.GetWorkflowExecutionRetentionPeriodInDays(),
EmitMetric: registerRequest.GetEmitMetric(),
HistoryArchivalStatus: nextHistoryArchivalState.Status,
HistoryArchivalURI: nextHistoryArchivalState.URI,
VisibilityArchivalStatus: nextVisibilityArchivalState.Status,
VisibilityArchivalURI: nextVisibilityArchivalState.URI,
BadBinaries: types.BadBinaries{Binaries: map[string]*types.BadBinaryInfo{}},
}
replicationConfig := &persistence.DomainReplicationConfig{
ActiveClusterName: activeClusterName,
Clusters: clusters,
}
isGlobalDomain := registerRequest.GetIsGlobalDomain()
if err := d.domainAttrValidator.validateDomainConfig(config); err != nil {
return err
}
if isGlobalDomain {
if err := d.domainAttrValidator.validateDomainReplicationConfigForGlobalDomain(
replicationConfig,
); err != nil {
return err
}
} else {
if err := d.domainAttrValidator.validateDomainReplicationConfigForLocalDomain(
replicationConfig,
); err != nil {
return err
}
}
failoverVersion := common.EmptyVersion
if registerRequest.GetIsGlobalDomain() {
failoverVersion = d.clusterMetadata.GetNextFailoverVersion(activeClusterName, 0, registerRequest.Name)
}
domainRequest := &persistence.CreateDomainRequest{
Info: info,
Config: config,
ReplicationConfig: replicationConfig,
IsGlobalDomain: isGlobalDomain,
ConfigVersion: 0,
FailoverVersion: failoverVersion,
LastUpdatedTime: d.timeSource.Now().UnixNano(),
}
domainResponse, err := d.domainManager.CreateDomain(ctx, domainRequest)
if err != nil {
return err
}
if domainRequest.IsGlobalDomain {
err = d.domainReplicator.HandleTransmissionTask(
ctx,
types.DomainOperationCreate,
domainRequest.Info,
domainRequest.Config,
domainRequest.ReplicationConfig,
domainRequest.ConfigVersion,
domainRequest.FailoverVersion,
common.InitialPreviousFailoverVersion,
domainRequest.IsGlobalDomain,
)
if err != nil {
return err
}
}
d.logger.Info("Register domain succeeded",
tag.WorkflowDomainName(registerRequest.GetName()),
tag.WorkflowDomainID(domainResponse.ID),
)
return nil
}