Пример #1
0
 public function validateBandwidth($attr, $params)
 {
     $oldBand = Connection::find()->where(['id' => $this->id])->asArray()->select(['bandwidth'])->one()['bandwidth'];
     if (!is_numeric($this->bandwidth) || !is_integer(intval($this->bandwidth)) || $this->bandwidth < 1) {
         $this->addError('bandwidth', "Invalid bandwidth value");
     } elseif ($oldBand != $this->bandwidth && !$this->acceptRelease) {
         $this->addError('bandwidth', "A circuit interruption is required to change the bandwidth.");
     }
 }
 static function makeHtml($notification = null)
 {
     if ($notification == null) {
         return "";
     }
     $reservation = Reservation::findOne($notification->info);
     if (!$reservation) {
         return "";
     }
     $connection = Connection::find()->where(['reservation_id' => $reservation->id])->one();
     $source = ConnectionPath::findOne(['conn_id' => $connection->id, 'path_order' => 0])->domain;
     $path_order = ConnectionPath::find()->where(['conn_id' => $connection->id])->count() - 1;
     $destination = ConnectionPath::findOne(['conn_id' => $connection->id, 'path_order' => $path_order])->domain;
     $title = Yii::t("notify", 'Reservation') . " (" . $reservation->name . ")";
     $connections = Connection::find()->where(['reservation_id' => $reservation->id])->all();
     //Se possui apenas uma conexão, então pode informar diretamente se foi aceito ou negado
     if (count($connections) < 2) {
         $msg = Yii::t("notify", 'The connection between') . " <b>" . $source . " </b>" . Yii::t("notify", 'and') . " <b>" . $destination . "</b> ";
         $date = Yii::$app->formatter->asDatetime($notification->date);
         $link = '/circuits/reservation/view?id=' . $reservation->id;
         if ($connections[0]->status == Connection::STATUS_FAILED_CREATE || $connections[0]->status == Connection::STATUS_FAILED_CONFIRM || $connections[0]->status == Connection::STATUS_FAILED_SUBMIT || $connections[0]->status == Connection::STATUS_FAILED_PROVISION || $connections[0]->status == Connection::STATUS_CANCELLED || $connections[0]->status == Connection::STATUS_CANCEL_REQ || $connections[0]->auth_status == Connection::AUTH_STATUS_REJECTED || $connections[0]->auth_status == Connection::AUTH_STATUS_EXPIRED) {
             $msg .= " " . Yii::t("notify", 'can not be provisioned.');
             $html = Notification::makeHtml('circuit_reject.png', $date, $title, $msg, $link);
         } else {
             $msg .= " " . Yii::t("notify", 'was provisioned.');
             $html = Notification::makeHtml('circuit_accept.png', $date, $title, $msg, $link);
         }
     } else {
         //Conta o número de provisionadas, rejeitadas (aglomera todos estados em que não vai ser gerado o circuito)
         //e pendentes (aglomera todos estados de processamento intermediário)
         $provisioned = 0;
         $reject = 0;
         $pending = 0;
         foreach ($connections as $conn) {
             if ($conn->status == Connection::STATUS_PROVISIONED) {
                 $provisioned++;
             } else {
                 if ($conn->status == Connection::STATUS_FAILED_CREATE || $conn->status == Connection::STATUS_FAILED_CONFIRM || $conn->status == Connection::STATUS_FAILED_SUBMIT || $conn->status == Connection::STATUS_FAILED_PROVISION || $conn->status == Connection::STATUS_CANCELLED || $conn->status == Connection::STATUS_CANCEL_REQ || $conn->auth_status == Connection::AUTH_STATUS_REJECTED || $conn->auth_status == Connection::AUTH_STATUS_EXPIRED) {
                     $reject++;
                 } else {
                     $pending++;
                 }
             }
         }
         $msg = Yii::t("notify", 'The status of connections changed:') . "<br />";
         $msg .= Yii::t("notify", 'Provisioned:') . " " . $provisioned . ", ";
         $msg .= Yii::t("notify", 'Rejected:') . " " . $reject . ", ";
         $msg .= Yii::t("notify", 'Pending:') . " " . $pending;
         $date = Yii::$app->formatter->asDatetime($notification->date);
         $link = '/circuits/reservation/view?id=' . $reservation->id;
         $html = Notification::makeHtml('circuit_changed.png', $date, $title, $msg, $link);
     }
     if ($notification->viewed == true) {
         return '<li>' . $html . '</li>';
     }
     return '<li class="notification_new">' . $html . '</li>';
 }
Пример #3
0
 function getConnectionStatus()
 {
     $conn = Connection::find()->where(['id' => Connection::find()->where(['reservation_id' => $this->id])->max("id")])->select(['status'])->one();
     if ($conn) {
         switch ($conn->status) {
             case Connection::STATUS_PENDING:
             case Connection::STATUS_CREATED:
             case Connection::STATUS_CONFIRMED:
                 return Yii::t("circuits", "Testing");
             case Connection::STATUS_SUBMITTED:
                 return Yii::t("circuits", "Passed");
             case Connection::STATUS_FAILED_CREATE:
             case Connection::STATUS_FAILED_CONFIRM:
             case Connection::STATUS_FAILED_SUBMIT:
                 return Yii::t("circuits", "Failed");
         }
     } else {
         return "Never tested";
     }
 }
 static function clearAuthorizations($userId)
 {
     //Limpa as notificações de autorização que ja foram respondidas
     $notAuth = Notification::find()->where(['user_id' => $userId, 'type' => Notification::TYPE_AUTHORIZATION, 'viewed' => false])->all();
     foreach ($notAuth as $not) {
         //Confere todas notificações do tipo autorização
         $auth = ConnectionAuth::findOne($not->info);
         if ($auth) {
             $connection = Connection::findOne($auth->connection_id);
             if ($connection) {
                 $connections = Connection::find()->where(['reservation_id' => $connection->reservation_id])->all();
                 $answered = true;
                 foreach ($connections as $conn) {
                     //Confere todas conexões da reserva conferindo se alguma ainda esta pendente
                     $auths = ConnectionAuth::find()->where(['domain' => $auth->domain, 'connection_id' => $conn->id])->all();
                     foreach ($auths as $a) {
                         //Confere as autorizaçòes daquela conexão
                         if ($a->type != ConnectionAuth::TYPE_WORKFLOW && $a->status == Connection::AUTH_STATUS_PENDING) {
                             $answered = false;
                             break;
                         }
                     }
                     if ($answered == false) {
                         break;
                     }
                 }
                 if ($answered) {
                     //Se ja foi respondida modifica notificação para visualizada
                     $not->viewed = true;
                     $not->save();
                 }
             }
         }
     }
 }
 /**
  * ACTION REJECT ALL
  * @param string $id
  * @param string $domainTop
  * @param string $message
  */
 public function actionRejectAll($id = null, $domainTop = null, $message = null)
 {
     Yii::trace("Reject ALL");
     Yii::trace("Reservation ID: " . $id);
     Yii::trace("Msg: " . $message);
     if ($id && $domainTop) {
         $userId = Yii::$app->user->getId();
         $reservation = Reservation::findOne(['id' => $id]);
         $allRequest = null;
         $connections = Connection::find()->where(['reservation_id' => $id])->all();
         foreach ($connections as $conn) {
             if ($allRequest == null) {
                 $allRequest = ConnectionAuth::find()->where(['connection_id' => $conn->id, 'domain' => $domainTop]);
             } else {
                 $allRequest->union(ConnectionAuth::find()->where(['connection_id' => $conn->id, 'domain' => $domainTop]));
             }
         }
         $allRequest = $allRequest->all();
         $domainRoles = User::findOne(['id' => $userId])->getRoles()->all();
         $requests = [];
         foreach ($allRequest as $request) {
             if ($request->manager_user_id == $userId) {
                 $requests[$request->id] = $request;
             } else {
                 foreach ($domainRoles as $domainRule) {
                     $groupId = $domainRule->getGroup()->id;
                     if ($request->manager_group_id == $groupId) {
                         $requests[$request->id] = $request;
                     }
                 }
             }
         }
         foreach ($requests as $req) {
             if ($req->status == Connection::AUTH_STATUS_PENDING) {
                 if ($req->type == ConnectionAuth::TYPE_GROUP) {
                     $req->manager_user_id = Yii::$app->user->getId();
                 }
                 if ($message) {
                     $req->manager_message = $message;
                 }
                 $req->status = Connection::AUTH_STATUS_REJECTED;
                 $req->save();
                 $flow = new BpmFlow();
                 $flow->response($req->connection_id, $req->domain, BpmFlow::STATUS_NO);
             }
         }
     }
 }
Пример #6
0
 public function actionIndex($format = 'json', $status = null, $type = null)
 {
     Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
     return new ActiveDataProvider(['query' => Connection::find()]);
 }
Пример #7
0
 public function getDestinationDomain()
 {
     $connection = Connection::find()->where(['reservation_id' => $this->id])->one();
     if (!$connection) {
         return null;
     }
     $path = $connection->getLastPath()->one();
     if (!$path) {
         return null;
     }
     return $path->domain;
 }
Пример #8
0
 public function actionGetAll($status, $type)
 {
     self::beginAsyncAction();
     $data = Yii::$app->cache->get('circuits.oscars.all');
     if ($data === false) {
         OscarsService::loadCircuits(Yii::$app->params['oscars.bridge.provider.url']);
         // store $data in cache so that it can be retrieved next time
         Yii::$app->cache->set('circuits.oscars.all', 'true', 120000);
     }
     $conns = Connection::find()->where(['dataplane_status' => $status, 'type' => $type])->with('fullPath')->asArray()->all();
     return json_encode($conns);
 }
Пример #9
0
 public function searchByDomains($params)
 {
     $this->load($params);
     $userId = Yii::$app->user->getId();
     $now = DateUtils::now();
     $authorizations = [];
     //Armazena os pedidos
     $reservationsVisited = [];
     //Armazena as reservas ja incluidas nos pedidos e o dominio ao qual o pedido foi feito.
     //Pega todas requisições feitas para o usuário
     if ($this->domain) {
         $userRequests = ConnectionAuth::find()->where(['domain' => $this->domain, 'manager_user_id' => $userId, 'status' => Connection::AUTH_STATUS_PENDING])->all();
     } else {
         $userRequests = ConnectionAuth::find()->where(['manager_user_id' => $userId, 'status' => Connection::AUTH_STATUS_PENDING])->all();
     }
     foreach ($userRequests as $request) {
         //Limpa mantendo apenas 1 por reserva
         $uniq = true;
         $conn = Connection::find()->where(['id' => $request->connection_id])->andWhere(['<=', 'start', DateUtils::now()])->one();
         if (isset($conn)) {
             $request->changeStatusToExpired();
             $conn->auth_status = Connection::AUTH_STATUS_EXPIRED;
             $conn->save();
             ReservationNotification::create($conn->id);
         } else {
             $conn = Connection::find()->where(['id' => $request->connection_id])->andWhere(['>', 'start', DateUtils::now()])->one();
             foreach ($reservationsVisited as $res) {
                 if ($conn->reservation_id == $res[0] && $request->domain == $res[1]) {
                     $uniq = false;
                 }
             }
             if ($uniq) {
                 $aux = [];
                 $aux[0] = $conn->reservation_id;
                 $aux[1] = $request->domain;
                 $reservationsVisited[] = $aux;
                 $source = $conn->getFirstPath()->one();
                 $destination = $conn->getLastPath()->one();
                 if (!$this->src_domain || $this->src_domain == $source->domain) {
                     if (!$this->dst_domain || $this->dst_domain == $destination->domain) {
                         $form = new AuthorizationForm();
                         $form->setValues(Reservation::findOne(['id' => $conn->reservation_id]), $request->domain, $source->domain, $destination->domain);
                         $authorizations[] = $form;
                     }
                 }
             }
         }
     }
     //Pega todos os papeis do usuário
     $domainRoles = User::findOne(['id' => $userId])->getRoles()->all();
     foreach ($domainRoles as $role) {
         //Passa por todos papeis
         if ($this->domain) {
             $groupRequests = ConnectionAuth::find()->where(['domain' => $this->domain, 'manager_group_id' => $role->getGroup()->id, 'status' => Connection::AUTH_STATUS_PENDING])->all();
         } else {
             $groupRequests = ConnectionAuth::find()->where(['manager_group_id' => $role->getGroup()->id, 'status' => Connection::AUTH_STATUS_PENDING])->all();
         }
         foreach ($groupRequests as $request) {
             //Passa por todas requisições para testar se o dominio corresponde
             $domain = Domain::findOne(['name' => $request->domain]);
             if ($domain) {
                 if ($role->domain == NULL || $role->domain == $domain->name) {
                     $uniq = true;
                     $conn = Connection::find()->where(['id' => $request->connection_id])->andWhere(['<=', 'start', DateUtils::now()])->one();
                     if (isset($conn)) {
                         $request->changeStatusToExpired();
                         $conn->auth_status = Connection::AUTH_STATUS_EXPIRED;
                         $conn->save();
                         ReservationNotification::create($conn->id);
                     } else {
                         $conn = Connection::find()->where(['id' => $request->connection_id])->andWhere(['>', 'start', DateUtils::now()])->one();
                         foreach ($reservationsVisited as $res) {
                             if ($conn->reservation_id == $res[0] && $domain->name == $res[1]) {
                                 $uniq = false;
                             }
                         }
                         if ($uniq) {
                             $aux = [];
                             $aux[0] = $conn->reservation_id;
                             $aux[1] = $request->domain;
                             $reservationsVisited[] = $aux;
                             $source = $conn->getFirstPath()->one();
                             $destination = $conn->getLastPath()->one();
                             if (!$this->src_domain || $this->src_domain == $source->domain) {
                                 if (!$this->dst_domain || $this->dst_domain == $destination->domain) {
                                     $form = new AuthorizationForm();
                                     $form->setValues(Reservation::findOne(['id' => $conn->reservation_id]), $request->domain, $source->domain, $destination->domain);
                                     $authorizations[] = $form;
                                 }
                             }
                         }
                     }
                 }
             }
         }
     }
     $dataProvider = new ArrayDataProvider(['allModels' => $authorizations, 'sort' => false, 'pagination' => ['pageSize' => 15]]);
     return $dataProvider;
 }
Пример #10
0
 private static function associateNSICircuits($conn)
 {
     $srcPoint = $conn->getFirstPath()->asArray()->one();
     $dstPoint = $conn->getLastPath()->asArray()->one();
     //procura circuitos NSI ativos e agendados para o mesmo horario
     //que o circuito OSCARS.
     $nsiActiveCircuits = Connection::find()->where(['type' => 'NSI', 'start' => $conn->start, 'finish' => $conn->finish])->all();
     foreach ($nsiActiveCircuits as $nsiCircuit) {
         $candidateSrcPoint = $nsiCircuit->getFirstPath()->asArray()->one();
         $candidateDstPoint = $nsiCircuit->getLastPath()->asArray()->one();
         Yii::trace($candidateSrcPoint);
         Yii::trace($candidateDstPoint);
         //Nao podemos atualmente garantir que a traducao de URNs funcione para outros dominios
         if ($candidateSrcPoint['domain'] != 'cipo.rnp.br' || $candidateDstPoint['domain'] != 'cipo.rnp.br') {
             return;
         }
         //URNs NMWG sao padronizadas entao podemos parsear
         //URNs NSI nao sao, logo teremos que fazer uma busca na URN
         //pelos elementos node e port da URN NMWG. Se estiverem presentes,
         //iremos considerar que representam a mesma porta.
         $srcDev = explode(':', $srcPoint['port_urn']);
         $srcDev = explode('=', $srcDev[4])[1];
         $dstDev = explode(':', $dstPoint['port_urn']);
         $dstDev = explode('=', $dstDev[4])[1];
         $srcPort = explode(':', $srcPoint['port_urn']);
         $srcPort = explode('=', $srcPort[5])[1];
         $dstPort = explode(':', $dstPoint['port_urn']);
         $dstPort = explode('=', $dstPort[5])[1];
         $dstPort = str_replace('/', '_', $dstPort);
         $srcPort = str_replace('/', '_', $srcPort);
         Yii::trace($srcDev);
         Yii::trace($dstDev);
         //Se ambos paths comecam e terminam na mesma VLAN e porta
         //eles representam o mesmo circuito.
         if ($srcPoint['vlan'] == $candidateSrcPoint['vlan'] && $dstPoint['vlan'] == $candidateDstPoint['vlan'] && StringUtils::contains($srcDev, $candidateSrcPoint['port_urn']) && StringUtils::contains($dstDev, $candidateDstPoint['port_urn']) && StringUtils::contains($srcPort, $candidateSrcPoint['port_urn']) && StringUtils::contains($dstPort, $candidateDstPoint['port_urn'])) {
             $conn->parent_id = $nsiCircuit->id;
             $conn->save();
         }
     }
 }
Пример #11
0
 public function querySummaryConfirmed($response)
 {
     $conn = Connection::find()->where(['external_id' => $response->reservation->connectionId])->one();
     if (!$conn) {
         return "";
     }
     $conn->buildEvent(ConnectionEvent::TYPE_NSI_SUMMARY_CONFIRMED, Yii::$app->request->getRawBody())->save();
     if ($conn->version != $response->reservation->criteria->version) {
         $conn->start = (new \DateTime($response->reservation->criteria->schedule->startTime))->format("Y-m-d H:i:s");
         $conn->finish = (new \DateTime($response->reservation->criteria->schedule->endTime))->format("Y-m-d H:i:s");
         $this->updateConnectionBandwidth($conn, $response);
         if ($conn->version == 0) {
             if ($this->updateConnectionPath($conn, $response)) {
                 //Como eh a primeira versao deve ser verificado se ha autorizacao para este circuito.
                 $conn->confirmRead();
             } else {
                 /////Path invalido
                 /////Inconsistencias na topologia
                 Yii::trace("path invalid?");
             }
         }
         $conn->version = $response->reservation->criteria->version;
     }
     if ($response->reservation->connectionStates->lifecycleState == "Terminated") {
         $conn->status = "CANCELLED";
     } elseif ($response->reservation->connectionStates->provisionState == "Provisioned") {
         $conn->resources_status = 'PROVISIONED';
         $conn->status = "PROVISIONED";
     } else {
         $conn->resources_status = 'RELEASED';
     }
     $conn->setActiveDataStatus($response->reservation->connectionStates->dataPlaneStatus->active);
     $conn->save();
     return "";
 }
Пример #12
0
 public function searchTerminatedByDomains($params, $allowed_domains)
 {
     $validDomains = [];
     $this->load($params);
     $userId = Yii::$app->user->getId();
     $domains_name = [];
     foreach ($allowed_domains as $domain) {
         $domains_name[] = $domain->name;
     }
     $connPaths = [];
     if ($this->src_domain && $this->dst_domain) {
         //if(in_array($this->src_domain, $domains_name) && in_array($this->dst_domain, $domains_name)){
         $dstPaths = ConnectionPath::findBySql("\n                    SELECT cp1.conn_id\n                    FROM (\n                        SELECT conn_id, MAX(`path_order`) AS last_path\n                        FROM `meican_connection_path`\n                        GROUP BY `conn_id`\n                        ) cp2\n                    JOIN    `meican_connection_path` cp1\n                    ON      cp1.conn_id = cp2.conn_id AND cp1.domain = '" . $this->dst_domain . "' AND cp1.path_order = cp2.last_path")->asArray()->all();
         $allowedConns = [];
         foreach ($dstPaths as $dstPath) {
             $allowedConns[] = $dstPath['conn_id'];
         }
         //filtra por conn aceitas pela query anterior
         $connPaths = ConnectionPath::find()->where(['in', 'domain', [$this->src_domain]])->andWhere(['path_order' => 0])->andWhere(['in', 'conn_id', $allowedConns])->select(["conn_id"])->distinct(true)->asArray()->all();
         //}
     } elseif ($this->src_domain) {
         //if(in_array($this->src_domain, $domains_name)){
         $connPaths = ConnectionPath::find()->where(['in', 'domain', [$this->src_domain]])->andWhere(['path_order' => 0])->select(["conn_id"])->distinct(true)->asArray()->all();
         //}
     } elseif ($this->dst_domain) {
         //if(in_array($this->dst_domain, $domains_name)){
         $connPaths = ConnectionPath::findBySql("\n                    SELECT cp1.conn_id\n                    FROM (\n                        SELECT conn_id, MAX(`path_order`) AS last_path\n                        FROM `meican_connection_path`\n                        GROUP BY `conn_id`\n                        ) cp2\n                    JOIN    `meican_connection_path` cp1\n                    ON      cp1.conn_id = cp2.conn_id AND cp1.domain = '" . $this->dst_domain . "' AND cp1.path_order = cp2.last_path")->asArray()->all();
         //}
     } else {
         foreach ($allowed_domains as $domain) {
             $validDomains[] = $domain->name;
         }
         $connPaths = ConnectionPath::find()->where(['in', 'domain', $validDomains])->select(["conn_id"])->distinct(true)->asArray()->all();
     }
     $validConnIds = [];
     foreach ($connPaths as $connPath) {
         $validConnIds[] = $connPath['conn_id'];
     }
     $validConns = Connection::find()->where(['in', 'id', $validConnIds])->select('reservation_id')->distinct(true)->asArray()->all();
     $validIds = [];
     foreach ($validConns as $conn) {
         $validIds[] = $conn['reservation_id'];
     }
     $invalidConnections = Connection::find()->where(['>=', 'finish', DateUtils::now()])->andWhere(['status' => ["PENDING", "CREATED", "CONFIRMED", "SUBMITTED", "PROVISIONED"]])->select(["reservation_id"])->distinct(true)->asArray()->all();
     $invalidIds = [];
     foreach ($invalidConnections as $conn) {
         $invalidIds[] = $conn['reservation_id'];
     }
     if (!$this->src_domain && !$this->dst_domain) {
         $reservations = Reservation::find()->where(['in', 'id', $validIds])->orWhere(['request_user_id' => Yii::$app->user->getId()])->andWhere(['not in', 'id', $invalidIds])->andWhere(['type' => self::TYPE_NORMAL])->orderBy(['date' => SORT_DESC])->asArray()->all();
     } else {
         $reservations = Reservation::find()->where(['not in', 'id', $invalidIds])->andWhere(['in', 'id', $validIds])->andWhere(['type' => self::TYPE_NORMAL])->orderBy(['date' => SORT_DESC])->asArray()->all();
     }
     $validResIds = [];
     foreach ($reservations as $res) {
         if ($res['request_user_id'] == $userId) {
             $validResIds[] = $res['id'];
         } else {
             if (!$this->request_user) {
                 $conns = Connection::find()->where(['reservation_id' => $res['id']])->select(["id"])->asArray()->all();
                 if (!empty($conns)) {
                     $conn_ids = [];
                     foreach ($conns as $conn) {
                         $conn_ids[] = $conn['id'];
                     }
                     $paths = ConnectionPath::find()->where(['in', 'domain', $domains_name])->andWhere(['in', 'conn_id', $conn_ids])->select(["conn_id"])->distinct(true)->asArray()->all();
                     if (!empty($paths)) {
                         $validResIds[] = $res['id'];
                     }
                 }
             }
         }
     }
     $dataProvider = new ActiveDataProvider(['query' => Reservation::find()->where(['in', 'id', $validResIds])->orderBy(['date' => SORT_DESC]), 'sort' => false, 'pagination' => ['pageSize' => 10]]);
     return $dataProvider;
 }