Jelajahi Sumber

Merged in FD3-756 (pull request #39)

FD3-756 seteo fixed ip cuando cambia el host type

Approved-by: Maximiliano Schvindt <maximiliano@interlink.com.ar>
Guillermo Espinoza 6 tahun lalu
induk
melakukan
cd01bd3497

+ 2 - 2
composer.lock

@@ -1550,7 +1550,7 @@
             "source": {
                 "type": "git",
                 "url": "ssh://git@200.50.168.30:222/VendorSoftwareFlowdat3/BaseOAuthClientBundle.git",
-                "reference": "596bc7b28ad90ba558da5b3eb5d7f26c583b148d"
+                "reference": "1c60fd91f1bb0fe5125da70908670629d4d341e6"
             },
             "require": {
                 "ext-curl": "*",
@@ -1569,7 +1569,7 @@
                 "bundle",
                 "oauth"
             ],
-            "time": "2018-10-23T15:06:48+00:00"
+            "time": "2018-12-04T13:12:24+00:00"
         },
         {
             "name": "ik/owner-voter-bundle",

+ 80 - 32
src/HostBundle/Command/CablemodemUpdateCommand.php

@@ -75,6 +75,7 @@ EOT
             'username' => $input->getOption('api-username'),
             'password' => $input->getOption('api-password'),
         ];
+        $this->connection = $this->getContainer()->get('database_connection');
         $this->webservice = $this->getContainer()->get('webservice');
         $em = $this->getContainer()->get('doctrine.orm.entity_manager');
         
@@ -108,15 +109,35 @@ EOT
      */
     private function findCablemodem($mac)
     {
-        $ws = $this->webservice;
-        $urlGET = $this->input->getOption('url-get');
-        
-        // Consulto en Cablemodem
-        $cablemodem = null;
-        $url = $ws->buildUrl($urlGET, compact('mac'));
-        $cablemodemJSON = $ws->makeGetRequest($url);
-        if ($cablemodemJSON) {
-            $cablemodem = current(json_decode($cablemodemJSON, true));
+        // Se consulta MySQL, de lo contrario se consulta por ws
+        try {
+            $cablemodem = null;
+            
+            $query = "SELECT * FROM fd3_cablemodem.cablemodem WHERE mac=:mac;";
+            $stmt = $this->connection->prepare($query);
+            $stmt->bindValue('mac', $mac);
+            $stmt->execute();
+            $result = $stmt->fetchAll();
+            if (isset($result[0])) {
+                $cablemodem  = $result[0];
+            } else {
+                $ws = $this->webservice;
+                $urlGET = $this->input->getOption('url-get');
+                
+                // Consulto en Cablemodem por ws
+                $url = $ws->buildUrl($urlGET, compact('mac'));
+                $cablemodemJSON = $ws->makeGetRequest($url);
+                if ($cablemodemJSON) {
+                    $decode = json_decode($cablemodemJSON, true);
+                    if (json_last_error() == JSON_ERROR_NONE) {
+                        $cablemodem = current($decode);
+                    } else {
+                        var_dump(json_last_error_msg());
+                    }
+                }
+            }
+        } catch (\Exception $ex) {
+            var_dump($ex->getMessage());
         }
         
         return $cablemodem;
@@ -130,29 +151,56 @@ EOT
      */
     private function updateCablemodem($cablemodem, $host)
     {
-        $ws = $this->webservice;
-        $id = $cablemodem['id'];
-        $urlPUT = str_replace('{id}', $id, $this->input->getOption('url-put'));
-        $fixedAddress = $host->getFixedAddress();
-        $data = [];
-        switch ($host->getHostType()->getShortname()) {
-            case 'cablemodem':
-                $data['fixedIP'] = $fixedAddress;
-                break;
-            case 'cpe':
-                $data['cpeFixedIP'] = $fixedAddress;
-                break;
-            case 'mta':
-                $data['mtaFixedIP'] = $fixedAddress;
-                break;
-            default:
-                $data['fixedIP'] = $fixedAddress;
-                break;
-        }
-        
-        $cablemodemJSON = $ws->makeGetRequest($urlPUT, HttpRequestInterface::METHOD_PUT, $data);
-        if ($cablemodemJSON) {
-            $cablemodem = current(json_decode($cablemodemJSON, true));
+        // actualizo por db o ws
+        try {
+            $fixedAddress = $host->getFixedAddress();
+            $data = [];
+            switch ($host->getHostType()->getShortname()) {
+                case 'cablemodem':
+                    $data['fixedIP'] = $fixedAddress;
+                    $set = 'fixed_ip=:fixed_ip';
+                    break;
+                case 'cpe':
+                    $data['cpeFixedIP'] = $fixedAddress;
+                    $set = 'cpe_fixed_ip=:fixed_ip';
+                    break;
+                case 'mta':
+                    $data['mtaFixedIP'] = $fixedAddress;
+                    $set = 'mta_fixed_ip=:fixed_ip';
+                    break;
+                default:
+                    $data['fixedIP'] = $fixedAddress;
+                    $set = 'fixed_ip=:fixed_ip';
+                    break;
+            }
+            
+            $query = sprintf("UPDATE fd3_cablemodem.cablemodem 
+                      SET %s
+                      WHERE mac=:mac;
+            ", $set);
+            
+            $stmt = $this->connection->prepare($query);
+            $stmt->bindValue('mac', $cablemodem['mac']);
+            $stmt->bindValue('fixed_ip', $fixedAddress);
+            $result = $stmt->execute();
+            
+            if (!$result) {
+                $ws = $this->webservice;
+                $id = $cablemodem['id'];
+                $urlPUT = str_replace('{id}', $id, $this->input->getOption('url-put'));
+                
+                $cablemodemJSON = $ws->makeGetRequest($urlPUT, HttpRequestInterface::METHOD_PUT, $data);
+                if ($cablemodemJSON) {
+                    $decode = json_decode($cablemodemJSON, true);
+                    if (json_last_error() == JSON_ERROR_NONE) {
+                        $cablemodem = current($decode);
+                    } else {
+                        var_dump(json_last_error_msg());
+                    }
+                }
+            }
+        } catch (\Exception $ex) {
+            var_dump($ex->getMessage());
         }
         
         return $cablemodem;

+ 42 - 26
src/HostBundle/Entity/Host.php

@@ -19,6 +19,7 @@ use WorkflowBundle\Entity\Traits\WorkflowTrait;
  * @UniqueEntity("mac")
  *
  * @Assert\Callback("validateFixedAddress")
+ * @Assert\Callback("validateHostType")
  */
 class Host implements WorkflowInterface
 {
@@ -106,7 +107,7 @@ class Host implements WorkflowInterface
     /**
      * @var integer $ipv4Address
      *
-     * @ORM\Column(name="ipv4_address", type="integer", nullable=true)
+     * @ORM\Column(name="ipv4_address", type="integer", nullable=true, options={"unsigned":true})
      */
     protected $ipv4Address;
 
@@ -267,31 +268,6 @@ class Host implements WorkflowInterface
         return $this->associatedHosts;
     }
     
-    /**
-     * @param ExecutionContextInterface $context
-     */
-    public function validateFixedAddress(ExecutionContextInterface $context)
-    {
-        global $kernel;
-        
-        if (!$kernel->getContainer()) {
-            // fix para los tests
-            return;
-        }
-        $em = $kernel->getContainer()->get('doctrine.orm.entity_manager');
-        $hostRepository = $em->getRepository(self::class);
-        $hosts = $hostRepository->findAll();
-        $options = json_decode($this->getOptions(), true);
-        $fixedAddress = isset($options['fixed_address']) ? $options['fixed_address'] : $this->getFixedAddress();
-        $fixedAddress = $fixedAddress ?: '';
-        foreach ($hosts as $host) {
-            if ($host->getId() != $this->id && $fixedAddress === $host->getFixedAddress()) {
-                $context->addViolation('options.fixed_address.not_unique');
-                break;
-            }
-        }
-    }
-
     /**
      * @return integer
      */
@@ -343,5 +319,45 @@ class Host implements WorkflowInterface
 
         return $this;
     }
+        
+    /**
+     * @param ExecutionContextInterface $context
+     */
+    public function validateFixedAddress(ExecutionContextInterface $context)
+    {
+        global $kernel;
+        
+        if (!$kernel->getContainer()) {
+            // fix para los tests
+            return;
+        }
+        $em = $kernel->getContainer()->get('doctrine.orm.entity_manager');
+        $hostRepository = $em->getRepository(self::class);
+        $hosts = $hostRepository->findAll();
+        $options = json_decode($this->getOptions(), true);
+        $fixedAddress = isset($options['fixed_address']) ? $options['fixed_address'] : $this->getFixedAddress();
+        $fixedAddress = $fixedAddress ?: '';
+        foreach ($hosts as $host) {
+            if ($host->getId() != $this->id && $fixedAddress === $host->getFixedAddress()) {
+                $context->addViolation('options.fixed_address.not_unique');
+                break;
+            }
+        }
+    }
+    
+    /**
+     * Si el host type es distinto de cablemodem tiene que tener host asociado
+     * @param ExecutionContextInterface $context
+     */
+    public function validateHostType(ExecutionContextInterface $context)
+    {
+        $hostType = $this->hostType;
+        if (!$hostType) {
+            return;
+        }
+        if ($hostType->getName() !== 'Cablemodem' && is_null($this->host)) {
+            $context->addViolation('host.host_null');
+        }
+    }
 
 }

+ 14 - 0
src/HostBundle/EventListener/AdminDHCPOption.php

@@ -8,6 +8,8 @@ use HostBundle\Services\HostService;
 use Sonata\AdminBundle\Event\ConfigureEvent;
 use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
 use Symfony\Component\Form\Extension\Core\Type\TextType;
+use Symfony\Component\Form\FormEvent;
+use Symfony\Component\Form\FormEvents;
 
 class AdminDHCPOption
 {
@@ -67,6 +69,18 @@ class AdminDHCPOption
                 $mapper->add($opt, TextType::class, $fieldOptions);
             }
             $mapper->end()->end();
+            
+            // fix seteo de fixed IP al editar el tipo de Host
+            $mapper->getFormBuilder()->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
+                $data = $event->getData();
+                $form = $event->getForm();
+                
+                if (isset($data['fixed_address'])) {
+                    $form->add('fixed_address', null, [
+                        'data' => $data['fixed_address'],
+                    ]);
+                }
+            });
         }
     }
 

+ 34 - 0
src/HostBundle/EventListener/KEAHostReservationSubscriber.php

@@ -58,6 +58,40 @@ class KEAHostReservationSubscriber implements EventSubscriber
     public function preRemove(LifecycleEventArgs $args)
     {
         $this->execute($args, true);
+        
+        // antes de eliminar un host actualizo las fixed ip 
+        // del cablemodem que tenga asociado
+        try {
+            $entity = $args->getEntity();
+            if ($entity instanceof Host) {
+                switch ($entity->getHostType()->getShortname()) {
+                    case 'cablemodem':
+                        $set = 'fixed_ip=:fixed_ip';
+                        break;
+                    case 'cpe':
+                        $set = 'cpe_fixed_ip=:fixed_ip';
+                        break;
+                    case 'mta':
+                        $set = 'mta_fixed_ip=:fixed_ip';
+                        break;
+                    default:
+                        $set = 'fixed_ip=:fixed_ip';
+                        break;
+                }
+                
+                $query = sprintf("UPDATE fd3_cablemodem.cablemodem 
+                    SET %s
+                    WHERE mac=:mac;
+                    ", $set);
+                $this->connection = $this->serviceContainer->get('database_connection');    
+                $stmt = $this->connection->prepare($query);
+                $stmt->bindValue('mac', $entity->getMac());
+                $stmt->bindValue('fixed_ip', null);
+                $result = $stmt->execute();
+            }
+        } catch (\Exception $ex) {
+            var_dump($ex->getMessage());
+        }
     }
 
     /**

+ 2 - 0
src/HostBundle/Resources/translations/validators.es.yml

@@ -0,0 +1,2 @@
+options.fixed_address.not_unique: La IP fija seleccionada ya esta asociada a otro host
+host.host_null: El tipo de host requiere que se asocie un host de tipo Cablemodem

+ 16 - 1
src/HostBundle/Resources/views/CRUD/edit.html.twig

@@ -24,14 +24,29 @@ $(document).ready(function() {
     
 });
 
+// Al seleccionar tipo Cablemodem oculto el campo Host
+// de lo contrario lo muestro y selecciono la primer option
+// luego actualizo las fixed IP según el tipo de host
 function showHostField()
 {
     var $hostTypeField = $("select[id$='hostType'] :selected");
     var $hostField = $("div.form-group[id$='host']");
-
+    var $hostSelect = $("select[id$='host']");
+    
     if ($hostTypeField.html() === 'Cablemodem') {
+        if ($hostSelect.find("option[value='']").length == 0) {
+            $hostSelect.prepend('<option value=""></option>');
+        }
+        $hostSelect.val(null).trigger('change');
+        
         $hostField.hide();
     } else {
+        if ($hostSelect.find("option[value='']").length) {
+            $hostSelect.find("option[value='']").remove();
+        }
+        var val = $hostSelect.find("option").first().attr('value');
+        $hostSelect.val(val).trigger('change');
+        
         $hostField.show();
     }