Example #1
0
 private function search()
 {
     foreach ($this->parser->getData()['domains'] as $domainName => $domainData) {
         $domain = Domain::findByName($domainName)->one();
         if ($domain == null) {
             $change = $this->buildChange();
             $change->domain = $domainName;
             $change->item_type = Change::ITEM_TYPE_DOMAIN;
             $change->data = json_encode(['' => '']);
             $change->type = Change::TYPE_CREATE;
             $change->save();
             $invalidDevices = false;
         } else {
             //VERIFICA DEVICES
             if ($this->parser instanceof NSIParser) {
                 $invalidDevices = Device::find()->where(['domain_id' => $domain->id]);
             } else {
                 $invalidDevices = false;
             }
             ///////////
         }
         if ($this->parser instanceof NSIParser && isset($domainData['nsa'])) {
             foreach ($domainData['nsa'] as $nsaId => $nsaData) {
                 $provider = Provider::find()->where(['nsa' => $nsaId])->one();
                 if (!$provider) {
                     $change = $this->buildChange();
                     $change->type = Change::TYPE_CREATE;
                     $change->domain = $domainName;
                     $change->item_type = Change::ITEM_TYPE_PROVIDER;
                     $change->data = json_encode(['name' => $nsaData['name'], 'type' => $nsaData['type'], 'lat' => $nsaData["lat"], 'lng' => $nsaData["lng"], 'nsa' => $nsaId]);
                     $change->save();
                 } elseif ($nsaData['lat'] && $nsaData['lng'] && intval($provider->latitude) != intval($nsaData['lat']) || intval($provider->longitude) != intval($nsaData['lng'])) {
                     $change = $this->buildChange();
                     $change->type = Change::TYPE_UPDATE;
                     $change->item_id = $provider->id;
                     $change->domain = $domainName;
                     $change->item_type = Change::ITEM_TYPE_PROVIDER;
                     $change->data = json_encode(['name' => $nsaData['name'], 'type' => $nsaData['type'], 'lat' => $nsaData["lat"], 'lng' => $nsaData["lng"], 'nsa' => $nsaId]);
                     $change->save();
                 }
                 if ($provider) {
                     $oldPeerings = $provider->getPeerings();
                     $oldServices = $provider->getServices();
                 }
                 $newPeerings = [];
                 $newServices = [];
                 if (isset($nsaData['peerings'])) {
                     foreach ($nsaData['peerings'] as $dstNsaId) {
                         if ($provider) {
                             $dstProv = Provider::findOneByNsa($dstNsaId);
                             if ($dstProv) {
                                 $peering = Peering::findOne(['src_id' => $provider->id, 'dst_id' => $dstProv->id]);
                                 if ($peering) {
                                     //$newPeerings[] = $peering->id;
                                     continue;
                                 }
                             }
                         }
                         $change = $this->buildChange();
                         $change->type = Change::TYPE_CREATE;
                         $change->domain = $domainName;
                         $change->item_type = Change::ITEM_TYPE_PEERING;
                         $change->data = json_encode(['srcNsaId' => $nsaId, 'dstNsaId' => $dstNsaId]);
                         $change->save();
                     }
                 }
                 foreach ($nsaData['services'] as $serviceUrl => $serviceType) {
                     $service = Service::findOneByUrl($serviceUrl);
                     if (!$service) {
                         $change = $this->buildChange();
                         $change->type = Change::TYPE_CREATE;
                         $change->domain = $domainName;
                         $change->item_type = Change::ITEM_TYPE_SERVICE;
                         $change->data = json_encode(['provName' => $nsaData['name'], 'provNsa' => $nsaId, 'type' => $serviceType, 'url' => $serviceUrl]);
                         $change->save();
                     } else {
                         $newServices[] = $service->id;
                     }
                 }
                 if ($provider) {
                     $oldServices = $oldServices->andWhere(['not in', 'id', $newServices])->select(['id'])->asArray()->all();
                     foreach ($oldServices as $invalidService) {
                         $change = $this->buildChange();
                         $change->type = Change::TYPE_DELETE;
                         $change->domain = $domainName;
                         $change->item_id = $invalidService['id'];
                         $change->item_type = Change::ITEM_TYPE_SERVICE;
                         $change->data = json_encode(['' => '']);
                         $change->save();
                     }
                 }
             }
         }
         //PERFSONAR
         if ($this->parser instanceof NMWGParser) {
             if (isset($domainData['devices'])) {
                 $this->importDevices($domainData["devices"], $domainName, $invalidDevices);
             }
             //NSI
         } else {
             if (isset($domainData['nets'])) {
                 $this->importNetworks($domainData["nets"], $domainName, $invalidDevices);
                 if ($invalidDevices) {
                     $invalidDevices = $invalidDevices->select(['id', 'node'])->asArray()->all();
                     foreach ($invalidDevices as $device) {
                         $change = $this->buildChange();
                         $change->type = Change::TYPE_DELETE;
                         $change->domain = $domainName;
                         $change->item_type = Change::ITEM_TYPE_DEVICE;
                         $change->item_id = $device['id'];
                         $change->data = json_encode(["node" => $device['node']]);
                         $change->save();
                     }
                 }
             }
         }
     }
 }
Example #2
0
 public function getPeerings()
 {
     return $this->hasMany(Peering::className(), ['provider_id' => 'id']);
 }
Example #3
0
 public function actionGetPeerings()
 {
     $peerings = Peering::find()->asArray()->all();
     $links = [];
     foreach ($peerings as $peering) {
         isset($links[$peering['src_id']]) ? null : ($links[$peering['src_id']] = []);
         $links[$peering['src_id']][] = $peering['dst_id'];
     }
     Yii::trace($links);
     return json_encode($links);
 }
Example #4
0
 public function apply()
 {
     $data = json_decode($this->data);
     switch ($this->item_type) {
         case self::ITEM_TYPE_DOMAIN:
             $dom = new Domain();
             $dom->name = $this->domain;
             $dom->color = ColorUtils::generate();
             $dom->default_policy = Domain::ACCEPT_ALL;
             if ($dom->save()) {
                 $this->setApplied();
                 return $this->save();
             } else {
                 $this->error = "Unknown";
             }
             break;
         case self::ITEM_TYPE_PROVIDER:
             switch ($this->type) {
                 case self::TYPE_CREATE:
                     $dom = Domain::findOneByName($this->domain);
                     if ($dom) {
                         $prov = new Provider();
                         $prov->nsa = $data->nsa;
                         $prov->name = $data->name;
                         $prov->type = $data->type;
                         $prov->latitude = $data->lat;
                         $prov->longitude = $data->lng;
                         $prov->domain_id = $dom->id;
                         if ($prov->save()) {
                             $this->setApplied();
                             return $this->save();
                         } else {
                             $this->error = "Unknown";
                         }
                     } else {
                         $this->error = "Domain does not exist";
                     }
                     break;
                 case self::TYPE_UPDATE:
                     $dom = Domain::findOneByName($this->domain);
                     if ($dom) {
                         $prov = Provider::findOne($this->item_id);
                         if ($prov) {
                             $prov->name = $data->name;
                             $prov->type = $data->type;
                             $prov->latitude = $data->lat;
                             $prov->longitude = $data->lng;
                             $prov->domain_id = $dom->id;
                             if ($prov->save()) {
                                 $this->setApplied();
                                 return $this->save();
                             } else {
                                 $this->error = "Unknown";
                             }
                         } else {
                             $this->error = "Provider does not exist";
                         }
                     } else {
                         $this->error = "Domain does not exist";
                     }
                     break;
                 case self::TYPE_DELETE:
                     $this->error = 'Invalid action';
                     break;
             }
             break;
         case self::ITEM_TYPE_PEERING:
             switch ($this->type) {
                 case self::TYPE_CREATE:
                     $prov = Provider::findOneByNsa($data->srcNsaId);
                     if ($prov) {
                         $dstProv = Provider::findOneByNsa($data->dstNsaId);
                         if ($dstProv) {
                             $peering = new Peering();
                             $peering->src_id = $prov->id;
                             $peering->dst_id = $dstProv->id;
                             if ($peering->save()) {
                                 $this->setApplied();
                                 return $this->save();
                             } else {
                                 $this->error = "Unknown";
                             }
                         } else {
                             $this->error = "Destination not found";
                         }
                     } else {
                         $this->error = "Source not found";
                     }
                     break;
                 case self::TYPE_UPDATE:
                     $port = Port::findOneByUrn($data->urn);
                     if ($port) {
                         $dstPort = Port::findOneByUrn($data->dst_urn);
                         if ($dstPort) {
                             $port->setAlias($dstPort);
                             if ($port->save()) {
                                 $this->setApplied();
                                 return $this->save();
                             } else {
                                 $this->error = "Unknown";
                             }
                         } else {
                             $this->error = "Destination not found";
                         }
                     } else {
                         $this->error = "Source not found";
                     }
                     break;
                 case self::TYPE_DELETE:
                     $port = Port::findOne($this->item_id);
                     if ($port) {
                         $port->alias_id = null;
                         if ($port->save()) {
                             $this->setApplied();
                             return $this->save();
                         } else {
                             $this->error = "Unknown";
                         }
                     } else {
                         $this->error = "Source not found";
                     }
             }
             break;
         case self::ITEM_TYPE_SERVICE:
             switch ($this->type) {
                 case self::TYPE_CREATE:
                     $prov = Provider::findOneByNsa($data->provNsa);
                     if ($prov) {
                         $service = new Service();
                         $service->provider_id = $prov->id;
                         $service->type = $data->type;
                         $service->url = $data->url;
                         if ($service->save()) {
                             $this->setApplied();
                             return $this->save();
                         } else {
                             $this->error = "Unknown";
                         }
                     } else {
                         $this->error = "Provider not found";
                     }
                     break;
                 case self::TYPE_UPDATE:
                     $this->error = "Invalid action";
                     break;
                 case self::TYPE_DELETE:
                     $service = Service::findOne($this->item_id);
                     if ($service) {
                         if ($service->delete()) {
                             $this->setApplied();
                             return $this->save();
                         } else {
                             $this->error = "Error deleting";
                         }
                     } else {
                         $this->error = "Service not found";
                     }
                     break;
             }
             break;
         case self::ITEM_TYPE_NETWORK:
             switch ($this->type) {
                 case self::TYPE_CREATE:
                     $dom = Domain::findOneByName($this->domain);
                     if ($dom) {
                         $net = new Network();
                         $net->latitude = $data->lat;
                         $net->longitude = $data->lng;
                         $net->name = $data->name;
                         $net->urn = $data->urn;
                         $net->domain_id = $dom->id;
                         if ($net->save()) {
                             $this->setApplied();
                             return $this->save();
                         } else {
                             $this->error = "Unknown";
                         }
                     } else {
                         $this->error = "Domain not found";
                     }
                     break;
                 case self::TYPE_UPDATE:
                     $net = Network::findOne($this->item_id);
                     if ($net) {
                         $net->latitude = $data->lat;
                         $net->longitude = $data->lng;
                         $net->name = $data->name;
                         if ($net->save()) {
                             $this->setApplied();
                             return $this->save();
                         } else {
                             $this->error = "Unknown";
                         }
                     } else {
                         $this->error = "Network not found";
                     }
                     break;
                 case self::TYPE_DELETE:
                     $this->error = "In development";
                     break;
             }
             break;
         case self::ITEM_TYPE_DEVICE:
             switch ($this->type) {
                 case self::TYPE_CREATE:
                     //NECESSARIO pq o parser nao analisa esse caso VERIFICAR
                     /* $dev = Device::findOneByDomainAndNode($this->domain, $data->node);
                        if ($dev) {
                            $dev->latitude = $data->lat;
                            $dev->longitude = $data->lng;
                            $dev->address = $data->address;
                        } else {*/
                     //}
                     $dom = Domain::findOneByName($this->domain);
                     if ($dom) {
                         $dev = new Device();
                         $dev->domain_id = $dom->id;
                         $dev->latitude = $data->lat;
                         $dev->longitude = $data->lng;
                         $dev->node = $data->node;
                         $dev->name = $dev->node;
                         $dev->address = $data->address;
                         if ($dev->save()) {
                             $this->setApplied();
                             return $this->save();
                         } else {
                             Yii::trace($dev->getErrors());
                             $this->error = "Unknown";
                         }
                     } else {
                         $this->error = 'Domain not found';
                     }
                     break;
                 case self::TYPE_UPDATE:
                     $dev = Device::findOne($this->item_id);
                     if ($dev) {
                         $dev->latitude = $data->lat;
                         $dev->longitude = $data->lng;
                         $dev->address = $data->address;
                         if ($dev->save()) {
                             $this->setApplied();
                             return $this->save();
                         } else {
                             Yii::trace($dev->getErrors());
                             $this->error = "Unknown";
                         }
                     } else {
                         $this->error = 'Device not found';
                     }
                     break;
                 case self::TYPE_DELETE:
                     $dev = Device::findOne($this->item_id);
                     if ($dev) {
                         if ($dev->delete()) {
                             $this->setApplied();
                             return $this->save();
                         } else {
                             $this->error = 'Fatal error. Contact the administrator.';
                         }
                     } else {
                         $this->error = 'Device not found';
                     }
             }
             break;
         case self::ITEM_TYPE_BIPORT:
             switch ($this->type) {
                 case self::TYPE_CREATE:
                     $dev = Device::findOneByDomainAndNode($this->domain, $data->node);
                     if ($dev) {
                         $port = new Port();
                         $port->type = $data->type;
                         $port->directionality = Port::DIR_BI;
                         $port->urn = $data->urn;
                         $port->name = $data->name;
                         $port->max_capacity = $data->cap_max;
                         $port->min_capacity = $data->cap_min;
                         $port->granularity = $data->granu;
                         $port->vlan_range = $data->vlan;
                         $port->device_id = $dev->id;
                         if ($data->netUrn) {
                             $net = Network::findByUrn($data->netUrn)->one();
                             if ($net) {
                                 $port->network_id = $net->id;
                             }
                         }
                         if ($port->save()) {
                             $this->setApplied();
                             return $this->save();
                         } else {
                             Yii::trace($port->getErrors());
                             $this->error = "Unknown";
                         }
                     }
                     break;
                 case self::TYPE_UPDATE:
                     $port = Port::findOne($this->item_id);
                     if ($port) {
                         $port->name = $data->name;
                         $port->max_capacity = $data->cap_max;
                         $port->min_capacity = $data->cap_min;
                         $port->granularity = $data->granu;
                         $port->vlan_range = $data->vlan;
                         if ($port->save()) {
                             $this->setApplied();
                             return $this->save();
                         } else {
                             Yii::trace($port->getErrors());
                             $this->error = "Unknown";
                         }
                     } else {
                         $this->error = "Port not found";
                     }
                     break;
                 case self::TYPE_DELETE:
                     $port = Port::findOne($this->item_id);
                     if ($port) {
                         if ($port->delete()) {
                             $this->setApplied();
                             return $this->save();
                         } else {
                             $this->error = 'Error deleting';
                         }
                     } else {
                         $this->error = 'Port not found';
                     }
             }
             break;
         case self::ITEM_TYPE_UNIPORT:
             switch ($this->type) {
                 case self::TYPE_CREATE:
                     $dev = Device::findOneByDomainAndNode($this->domain, $data->node);
                     $biPortUrn = Port::findOne(['urn' => $data->biPortUrn]);
                     if ($dev && $biPortUrn) {
                         $port = new Port();
                         $port->type = Port::TYPE_NSI;
                         if ($data->dir == "IN") {
                             $port->directionality = Port::DIR_UNI_IN;
                         } else {
                             $port->directionality = Port::DIR_UNI_OUT;
                         }
                         $port->urn = $data->urn;
                         $port->name = $data->name;
                         $port->max_capacity = $data->cap_max;
                         $port->min_capacity = $data->cap_min;
                         $port->granularity = $data->granu;
                         $port->biport_id = $biPortUrn->id;
                         $port->vlan_range = $data->vlan;
                         $port->device_id = $dev->id;
                         if ($data->netUrn) {
                             $net = Network::findByUrn($data->netUrn)->one();
                             if ($net) {
                                 $port->network_id = $net->id;
                             }
                         }
                         if ($port->save()) {
                             $this->setApplied();
                             return $this->save();
                         } else {
                             $this->error = "Unknown";
                         }
                     }
                     break;
                 case self::TYPE_UPDATE:
                     $port = Port::findOne($this->item_id);
                     if ($port) {
                         $port->name = isset($data->name) ? $data->name : $port->name;
                         $port->max_capacity = isset($data->cap_max) ? $data->cap_max : null;
                         $port->min_capacity = isset($data->cap_min) ? $data->cap_min : null;
                         $port->granularity = isset($data->granu) ? $data->granu : null;
                         $port->vlan_range = isset($data->vlan) ? $data->vlan : null;
                         if ($port->save()) {
                             $this->setApplied();
                             return $this->save();
                         } else {
                             $this->error = "Unknown";
                         }
                     } else {
                         $this->error = "Port not found";
                     }
                     break;
                 case self::TYPE_DELETE:
                     $port = Port::findOne($this->item_id);
                     if ($port) {
                         if ($port->delete()) {
                             $this->setApplied();
                             return $this->save();
                         } else {
                             $this->error = 'Error deleting port';
                         }
                     } else {
                         $this->error = 'Port not found';
                     }
             }
             break;
         case self::ITEM_TYPE_LINK:
             switch ($this->type) {
                 case self::TYPE_CREATE:
                     $port = Port::findOneByUrn($data->urn);
                     if ($port) {
                         $dstPort = Port::findOneByUrn($data->dst_urn);
                         if ($dstPort) {
                             $port->setAlias($dstPort);
                             if ($port->save()) {
                                 $this->setApplied();
                                 return $this->save();
                             } else {
                                 $this->error = "Unknown";
                             }
                         } else {
                             $this->error = 'Destination port not found';
                         }
                     } else {
                         $this->error = "Source port not found";
                     }
                     break;
                 case self::TYPE_UPDATE:
                     $port = Port::findOneByUrn($data->urn);
                     if ($port) {
                         $dstPort = Port::findOneByUrn($data->dst_urn);
                         if ($dstPort) {
                             $port->setAlias($dstPort);
                             if ($port->save()) {
                                 $this->setApplied();
                                 return $this->save();
                             } else {
                                 $this->error = "Unknown";
                             }
                         } else {
                             $this->error = 'Destination port not found';
                         }
                     } else {
                         $this->error = "Source port not found";
                     }
                     break;
                 case self::TYPE_DELETE:
                     $port = Port::findOne($this->item_id);
                     if ($port) {
                         $port->alias_id = null;
                         if ($port->save()) {
                             $this->setApplied();
                             return $this->save();
                         } else {
                             $this->error = "Unknown";
                         }
                     } else {
                         $this->error = "Source port not found";
                     }
             }
             break;
         default:
             break;
     }
     $this->status = self::STATUS_FAILED;
     $this->save();
     return false;
 }