+
+func (m E2TShutdownManager) reassociateNodebs(ranNamesToBeAssociated map[string][]string) error {
+ for e2tAddress, ranNames := range ranNamesToBeAssociated {
+
+ err := m.associateAndSetupNodebs(ranNames, e2tAddress)
+ if err != nil {
+ return err
+ }
+
+ }
+ return nil
+}
+
+func (m E2TShutdownManager) clearNodebsAssociation(ranNamesToBeDissociated []string) error {
+ return m.associateAndSetupNodebs(ranNamesToBeDissociated, "")
+}
+
+func (m E2TShutdownManager) associateAndSetupNodebs(ranNamesToBeUpdated []string, e2tAddress string) error {
+ for _, ranName := range ranNamesToBeUpdated {
+ nodeb, err := m.rnibDataService.GetNodeb(ranName)
+ if err != nil {
+ m.logger.Warnf("#E2TShutdownManager.associateAndSetupNodebs - Failed to get nodeb %s from db.", ranName)
+ _, ok := err.(*common.ResourceNotFoundError)
+ if !ok {
+ continue
+ }
+ return err
+ }
+ nodeb.AssociatedE2TInstanceAddress = e2tAddress
+ err = m.rnibDataService.UpdateNodebInfo(nodeb)
+ if err != nil {
+ m.logger.Errorf("#E2TShutdownManager.associateAndSetupNodebs - Failed to save nodeb %s from db.", ranName)
+ return err
+ }
+
+ shouldSendSetup := len(e2tAddress) > 0
+ if shouldSendSetup {
+ err = m.ranSetupManager.ExecuteSetup(nodeb, entities.ConnectionStatus_CONNECTING)
+ if err != nil {
+ m.logger.Errorf("#E2TShutdownManager.associateAndSetupNodebs - Failed to execute Setup for nodeb %s.", ranName)
+ continue
+ }
+ }
+ }
+ return nil
+}
+
+func (m E2TShutdownManager) reAssociateRanInMemory(ranName string, ranNamesToBeAssociated map[string][]string, ranNamesToBeDissociated []string) error {
+ nodeb, err := m.rnibDataService.GetNodeb(ranName)
+ if err != nil {
+
+ _, ok := err.(*common.ResourceNotFoundError)
+
+ if !ok {
+ m.logger.Errorf("#E2TShutdownManager.reAssociateRanInMemory - Failed to get nodeb %s from db.", ranName)
+ return err
+ }
+
+ m.logger.Errorf("#E2TShutdownManager.reAssociateRanInMemory - nodeb %s not found in db. dissociating it...", ranName)
+ ranNamesToBeDissociated = append(ranNamesToBeDissociated, ranName)
+ return nil
+ }
+
+ if nodeb.ConnectionStatus == entities.ConnectionStatus_SHUTTING_DOWN || nodeb.ConnectionStatus == entities.ConnectionStatus_SHUT_DOWN {
+ m.logger.Errorf("#E2TShutdownManager.reAssociateRanInMemory - nodeb %s status is %s. dissociating it...", ranName, nodeb.ConnectionStatus)
+ ranNamesToBeDissociated = append(ranNamesToBeDissociated, ranName)
+ return nil
+ }
+
+ selectedE2tAddress, err := m.e2TInstancesManager.SelectE2TInstance()
+ if err != nil {
+ m.logger.Infof("#E2TShutdownManager.reAssociateRanInMemory - No selected E2T instance for nodeb %s found.", ranName)
+ ranNamesToBeDissociated = append(ranNamesToBeDissociated, ranName)
+ return nil
+ }
+
+ ranNamesToBeAssociated[selectedE2tAddress] = append(ranNamesToBeAssociated[selectedE2tAddress], ranName)
+ return nil
+}
+
+func (m E2TShutdownManager) markE2tInstanceToBeDeleted(e2tInstance *entities.E2TInstance) error {
+ e2tInstance.State = entities.ToBeDeleted
+ e2tInstance.DeletionTimestamp = time.Now().UnixNano()
+
+ return m.rnibDataService.SaveE2TInstance(e2tInstance)
+}
+
+func (m E2TShutdownManager) isE2tInstanceAlreadyBeingDeleted(e2tInstance *entities.E2TInstance) bool {
+ delta := time.Now().UnixNano() - e2tInstance.DeletionTimestamp
+ timestampNanosec := int64(time.Duration(m.config.E2TInstanceDeletionTimeoutMs) * time.Millisecond)
+
+ return delta <= timestampNanosec
+}